我想允许用户通过点击链接验证他们的电子邮件地址.链接看起来像
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中的nice crypto库 添加base64安全编码是我的.
您最好的选择是生成某些用户数据的哈希(单向函数).例如,要生成用户行id的哈希值,您可以使用以下内容:
>>> import hashlib >>> hashlib.sha1('3').hexdigest() '77de68daecd823babbb58edb1c8e14d7106e83bb'
但是,仅将伪随机字符串基于行ID是不安全的,因为用户可以轻松地反转这样一个短字符串的散列(尝试使用googling 77de68daecd823babbb58edb1c8e14d7106e83bb).
这里一个简单的解决方案是对散列字符串进行"加盐",即将相同的秘密字符串添加到散列的每个值.例如:
>>> hashlib.sha1('3' + 'email@of.user' + 'somestringconstant').hexdigest() 'b3ca694a9987f39783a324f00cfe8279601decd3'
如果你谷歌b3ca694a9987f39783a324f00cfe8279601decd3,可能唯一的结果将是这个答案的链接:-),这不是一个证据,但一个很好的提示,这个哈希是非常独特的.