什么是ID混淆

所谓ID混淆就是将业务数据中的ID字段通过算法混淆(编码)成可被还原的加密字符串。

它被应用在很多网站上,比如Youtube视频网站对每个视频资源都做了ID混淆操作,这样做的好处可以限制爬虫,如果将连续自增的ID暴露出来,爬虫很轻松就能反推出系统中所有的资源。

例如:https://www.youtube.com/watch?v=yhv8l9F44qo 这个链接中后面的yhv8l9F44qo 就是做了ID混淆,数据库中保存字段还是自带的索引主键。

hashids-python 这个库提供了ID混淆功能,使用也非常简单。接下来就跟着我学习怎么使用吧。

安装

pip install hashids

使用

>>> from hashids import Hashids
>>> hashids = Hashids()
>>> hashids.encode(1000)
'gN3'

通过encode方法把整数1000编码成字符串 gN3,通过decode方法可以恢复成原来的值。

>>> hashids.decode('gN3')
(1000,)
>>>

注意这里返回的是一个tuple对象,要取第一个元素。

>>> hashids.decode("rwrijwersd")
()

如果你随机用一个混淆的字符串反推原数值时,返回的结果是一个空的tuple,所以这就避免爬虫在不知道ID的情况下获取数据了。

加盐处理

可能还不满足我们的需求,因为大家使用的都是一样的算法,生成的混淆字符串太短,如果没有带盐值的话,容易被破解。
所以在初始化Hashids对象的时候,你可以自己指定一个salt参数,这样只要别人不知道的盐值是多少,几乎不可能猜出来。

>>> hashids = Hashids(salt='suijizifuchuan')
>>> hashids.encode(1000)
'DM4'
>>> hashids.decode("DM4")
(1000,)
>>>

设置长度

生成的混淆字符串长度太短时,我们可以通过指定min_length 参数来设置混淆字符串的长度。

>>> hashids = Hashids(salt="suijizifuchuan", min_length=16)
>>> hashids.encode(1000)
'Ypq6GPrDM4lKMod2'
>>> hashids.decode("Ypq6GPrDM4lKMod2")
(1000,)

设置成特定的混淆字符串

如果你希望混淆的字符串是纯数字或者纯字母,也可以通过参数alphabet来指定

>>> hashids = Hashids(salt="suijizifuchuan", min_length=16, alphabet="abcdefghijklmnopqrstuvwxyz")
>>> hashids.encode(1000)
'qdvnlojbebkmapwx'

最后的思考

ID混淆本质上也是一种加密算法,只不过这种算法是可逆的。