一般来说,我们推荐使用整数Id作为数据表的主键,这样可以提供不少好处:存储空间小,简洁易懂,方便分页、排序、索引。

但当这种Id暴露到外部时,比如订单号,就存在一定的风险了。因为不管是自增、雪花算法(SnowFlake)或者自定义算法,生成的Id都是存在一定规律可循,容易被爬虫生成Id用于爬站,甚至泄露数据。

要想避免这种风险,比较简单的方案是将Id加密成无意义的字符串,但是通过这些字符串又可以反向映射出真实的Id以供内部使用。比如B站的播放链接https://www.bilibili.com/video/BV1xK4y1VXXX应该就是这种实现方式。

而hashids就可以很好地满足上述需求。

hashids介绍

hashids[1]是一个小型的开源库,它可以把数字生成简短、唯一、非连续的随机字符串。不同于md5 hash这种只能单向加密,hashids还可以把这些Id解码回来。

hashids提供多种编程语言的实现,在这里我们使用的是它的.Net版本hashids.net[2]

1.创建实例

首先引用nuget包hashids.net,然后初始化一个实例:

var hashids = new Hashids("公众号My IO");//加盐

hashids的优点是初始化时可以设置salt值,相当于编解码的私钥。这样就算别人知道是用hashids加密的,但是不知道你的salt值,就不可能生成符合要求的字符串Id,也无法解码。

2.加解密int

var str = hashids.Encode(12345);
var num = hashids.Decode(str)[0];//输出
WwYQ
12345

hashids支持同时传入多个Id加密,因此解密的结果是一个数组,这里我们只取第一个。

3.加解密long

雪花算法生成的long类型id也支持。

var str = hashids.EncodeLong(666555444333222L);
var num = hashids.DecodeLong(str)[0];//输出
eJR1llm5RzA
666555444333222

4.高级用法

限制最小长度

从上面的例子可以看到,加密后得到的字符串WwYQ太短了,以现在的计算机速度很容易遍历出来,因此我们可以限制生成的最小长度,增大破解难度。

var hashids = new Hashids("公众号My IO",minHashLength:8);
var str = hashids.Encode(12345);
var num = hashids.Decode(str)[0];
var success = (hashids.Decode("WwYQ").Any());//输出
0ZWwYQZo
12345
False

设置了最小长度为8,所以原来的短字符串已经无法解密了。

自定义哈希字母表

默认加密字符串只包含大小写字母和数字,我们可以使用其他unicode作为哈希字母表,增大破解难度。

var hashids = new Hashids("公众号My IO", alphabet: @"あいうえおかきくけこさしすせそたちつてと");
var str = hashids.Encode(12345);//输出
とつくとき

欢迎关注我的个人公众号”My IO“参考

[1]

hashids: https://hashids.org/

[2]

hashids.net: https://github.com/ullmark/hashids.net

Id都是“とつくとき”这样的怎么爬,在线等,急相关推荐

  1. 瞎弄电脑BIOS设置,再次开机进入BitLocker恢复,恰巧微软账户啥密钥ID都有,就是和自己这个密钥对不上,然后如何将自己密钥保存到微软账户

    系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 文章目录 前言 一.问题描述 二.解决步 ...

  2. 有两个以上的USB设备,他们的Vendor ID和Product ID都一样,如何指定对应的usb插口和/dev/ttyUSB的序号?

    如果有两个以上的USB设备,他们的Vendor ID和Product ID都一样,那么无法通过Vendor ID和Product ID来区分它们.需要采取其他方式来指定对应的USB插口和/dev/tt ...

  3. python网易云爬虫——实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取)

    Python网易云爬虫--实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取) 开始动手 打开网易云音乐,找到任意一位歌手的歌曲界面(我们以邓紫棋的<来自天堂的魔鬼>为例). 第一步 ...

  4. 标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。 当两只蚂蚁碰面时,它们会同时掉头

    标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒.当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行.这些蚂蚁中,有1只 ...

  5. 为什么每个远程工作者都应该使用虚拟浏览器进行在线协作?

    您知道为什么每个远程工作者都应该使用虚拟浏览器进行在线协作吗?请在这篇博客中发现其中的优势! 为什么每个远程工作者都应该使用虚拟浏览器进行在线协作? 最近,远程办公越来越流行.许多公司也推出远程办公政 ...

  6. 我每天都要打开的8个在线网站,很有用~

    我很喜欢收藏一些在线的网站,因为很方面,需要用到的时候就直接点开浏览器的收藏夹,只需要用手机号或者微信号登录即可,而且支持在线保存的功能 ,十分的方便哦. 1.腾讯文档 网址:https://docs ...

  7. 大神都已经在用python爬取高德地图了

    一. 分析网页结构 本篇博文就以高德地图展开:https://www.amap.com/ 在打开后,我们发现有一堆div标签,但是并没有我们需要的数据,这个时候就可以判定其为动态网页,这个时候,我们就 ...

  8. 2018 年最受欢迎的电影,你都看过哪些?爬猫眼电影

    阅读文本大概需要 18 分钟 ^_^ 双11已经过去,双12即将来临,离2018年的结束也就2个月不到,还记得年初立下的flag吗? 完成了多少?相信很多人和我一样,抱头痛哭... 本次利用猫眼电影, ...

  9. 新媒体人都在用的6款在线设计工具

    无论是在工作中还是学习中,经常会需要用到各种工具.学会运用工具,可以让你事半功倍,轻松高效地完成任务!今天给大家整理几款高效的在线设计工具,一起来看看吧! 01.稿定设计--贴图加水印 网址:http ...

最新文章

  1. c++2015-2019存在异常_什么是血脂?什么是脂蛋白?什么是血脂异常?有哪些危害?...
  2. 构造函数中不应调用虚函数
  3. mysql 导入 相对路径,MySQL数据库导出与导入及常见错误解决
  4. linux ftp 后台执行,Linux环境CENTOS下apache-ftpserver搭建配置及后台启动
  5. 合并排序算法排序过程_外部合并排序算法
  6. 38 WM配置-作业-定义库存转储和补充控制
  7. iOS 的内存管理和虚拟内存机制具体是怎么运作的?
  8. poj 1743 Musical Theme【后缀自动机】
  9. python图像化计算器
  10. 【海康威视】WPF客户端二次开发:【2】语音对讲
  11. RL(Chapter 5): Monte Carlo Methods (MC) (蒙特卡洛方法)
  12. oracle中imp命令详解
  13. mybatis自动生成更新时间和创建时间
  14. 【Vue3.0移动端项目--旅游网】-- 房屋详情页创建以及房屋详情图片展示
  15. Android桥方法设置GPS信号,android-GPS更新间隔更快,信号良好?
  16. zzzfun网站连接不上服务器,ZzzFun
  17. php两个字符串公共,C++_C语言求两个字符串的最长公共子串,本文实例讲述了C语言求两个字 - phpStudy...
  18. RK3399 Android7.1如何查看屏幕分辨率
  19. GDAL python教程基础篇(2)——用OGR写入矢量数据
  20. x-ray图像增强算法

热门文章

  1. .NET 时间格式 ----------摘自MSDN
  2. linux汇编中的注释,Linux 汇编器:对照 GAS 和 NASM
  3. 类属性和实例属性冲突
  4. iOS SQLite函数总结
  5. C#中as和is关键字
  6. centos proftp_在CentOS上禁用ProFTP
  7. 谷歌浏览器的翻译功能在哪_如何在Google表格中使用AND和OR功能
  8. 如何停止Internet Explorer 11的建议站点?
  9. mysql经典的8小时问题-wait_timeout
  10. 配置基于python的VIM环境