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

一般来说,我们推荐使用整数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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值