Kor*_*eel 5 python encryption google-app-engine encoding
我的数据库中的每个用户对象都有一个增量ID(1,2,3,...).查看用户配置文件的URL包含用户对象的ID; 例如http://www.example.com/users/1.这样每个人都可以看到网站上有多少用户,用户群增长的速度等等.我不想提供这些信息.
我想将增量ID转换为Base58格式的固定长度字符串,因此URL看起来像http://www.example.com/users/2WNrx2jq184此外,我需要将字符串转换回的字符串的反向函数原始身份证.反向功能不应该易于逆向工程.
我为此找到的最好的Python代码是https://github.com/JordanReiter/django-id-obfuscator.这是非常好的,但在某些情况下,它会添加一个0和/或.字符,这会导致字符串不在Base58中而不是固定长度.(参见utils.py第24和29行)
如何改进django-id-obfuscator以产生固定长度的base58混淆ID,或者如何在Python中创建这样的混淆ID?
如果要正确执行此操作,请使用您的用户ID,使用前导零填充它,然后使用AES等加密它并使用base58对结果进行编码.要获取ID,只需解码,解密和int()结果.
所以加密:
>>> from Crypto.Cipher import AES
>>> import base64
>>> obj = AES.new('yoursecretkeyABC')
>>> x = base64.encodestring(obj.encrypt("%016d"%1))
>>> x
'tXDxMg1YGb1i0V29yCCBWg==\n'
Run Code Online (Sandbox Code Playgroud)
和解密
>>> int(obj.decrypt(base64.decodestring(x)))
1
Run Code Online (Sandbox Code Playgroud)
如果你可以忍受弱加密,你也可以简单地用一个密钥来填充填充的ID:
>>> key = [33, 53, 2, 42]
>>> id = "%04d" % 1
>>> x = ''.join([chr(a^ord(b)) for a, b in zip(key, id)])
>>> x
'\x11\x052\x1b'
>>> int(''.join([chr(a^ord(b)) for a, b in zip(key, x)]))
1
Run Code Online (Sandbox Code Playgroud)
但这不太安全,因为你永远不应该为多个消息使用相同的OTP.还要确保密钥与填充ID的长度相同.