在python中进行双向散列的最佳实践?

时间:2009-03-29 00:06:00

标签: python

我想允许用户通过点击链接验证他们的电子邮件地址。链接看起来像

http://www.example.com/verifyemail?id=some-random-string

当我发送此电子邮件时,我希望能够从用户的行ID(整数)轻松生成此“some-random-string”。当用户点击此链接时,返回生成该整数。

只有要求这个'some-random-string'应尽可能不透明且不可猜测。


最后,这是我坚持的原因

def p3_encrypt_safe(plain, key):
    return base64.urlsafe_b64encode(p3_encrypt(plain, key))

使用了来自http://www.nightsong.com/phr/crypto/p3.py的漂亮的加密库 添加base64安全编码是我的。

2 个答案:

答案 0 :(得分:5)

您最好的选择是生成某些用户数据的哈希(单向函数)。例如,要生成用户行id的哈希值,您可以使用类似:

的内容
>>> import hashlib
>>> hashlib.sha1('3').hexdigest()
'77de68daecd823babbb58edb1c8e14d7106e83bb'

但是,仅将伪随机字符串基于行ID是不安全的,因为用户可以轻松地反转这种短字符串的散列(尝试googling 77de68daecd823babbb58edb1c8e14d7106e83bb)。

这里的一个简单解决方案是对散列字符串进行“加盐”,即将相同的秘密字符串添加到散列的每个值。例如:

>>> hashlib.sha1('3' + 'email@of.user' + 'somestringconstant').hexdigest()
'b3ca694a9987f39783a324f00cfe8279601decd3'

如果你google b3ca694a9987f39783a324f00cfe8279601decd3,可能唯一的结果是这个答案的链接:-),这不是证据,但是这个哈希非常独特的好提示。

答案 1 :(得分:4)

使用加密,这正是它的设计目标。如果你不需要特别高的安全性,那么Blowfish,AES,甚至DES3。

或者,您可以计算电子邮件地址的SHA-256或SHA-512(或其他)哈希值,并将其与电子邮件地址本身一起存储在数据库中。这样您就可以使用哈希作为密钥来查找电子邮件地址。