Id都是“とつくとき”这样的怎么爬,在线等,急
一般來說,我們推薦使用整數(shù)Id作為數(shù)據(jù)表的主鍵,這樣可以提供不少好處:存儲空間小,簡潔易懂,方便分頁、排序、索引。
但當這種Id暴露到外部時,比如訂單號,就存在一定的風險了。因為不管是自增、雪花算法(SnowFlake)或者自定義算法,生成的Id都是存在一定規(guī)律可循,容易被爬蟲生成Id用于爬站,甚至泄露數(shù)據(jù)。
要想避免這種風險,比較簡單的方案是將Id加密成無意義的字符串,但是通過這些字符串又可以反向映射出真實的Id以供內(nèi)部使用。比如B站的播放鏈接https://www.bilibili.com/video/BV1xK4y1VXXX應該就是這種實現(xiàn)方式。
而hashids就可以很好地滿足上述需求。
hashids介紹
hashids[1]是一個小型的開源庫,它可以把數(shù)字生成簡短、唯一、非連續(xù)的隨機字符串。不同于md5 hash這種只能單向加密,hashids還可以把這些Id解碼回來。
hashids提供多種編程語言的實現(xiàn),在這里我們使用的是它的.Net版本hashids.net[2]。
1.創(chuàng)建實例
首先引用nuget包hashids.net,然后初始化一個實例:
var?hashids?=?new?Hashids("公眾號My?IO");//加鹽hashids的優(yōu)點是初始化時可以設置salt值,相當于編解碼的私鑰。這樣就算別人知道是用hashids加密的,但是不知道你的salt值,就不可能生成符合要求的字符串Id,也無法解碼。
2.加解密int
var?str?=?hashids.Encode(12345); var?num?=?hashids.Decode(str)[0];//輸出 WwYQ 12345hashids支持同時傳入多個Id加密,因此解密的結果是一個數(shù)組,這里我們只取第一個。
3.加解密long
雪花算法生成的long類型id也支持。
var?str?=?hashids.EncodeLong(666555444333222L); var?num?=?hashids.DecodeLong(str)[0];//輸出 eJR1llm5RzA 6665554443332224.高級用法
限制最小長度
從上面的例子可以看到,加密后得到的字符串WwYQ太短了,以現(xiàn)在的計算機速度很容易遍歷出來,因此我們可以限制生成的最小長度,增大破解難度。
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,所以原來的短字符串已經(jīng)無法解密了。
自定義哈希字母表
默認加密字符串只包含大小寫字母和數(shù)字,我們可以使用其他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都是“とつくとき”这样的怎么爬,在线等,急的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你构建WPF官方开源框架源代码
- 下一篇: FastTunnel-开源内网穿透框架