python中双向哈希的最佳实践?

python中双向哈希的最佳实践?,python,Python,我想允许用户通过点击链接来验证他们的电子邮件地址。链接看起来像 当我发送此电子邮件时,我希望能够轻松地从用户的行id(一个整数)生成此“一些随机字符串”。当用户点击这个链接时,生成那个整数 唯一的要求是“一些随机字符串”应该尽可能不透明,用户不可猜测 最后,这是我决定的 def p3_encrypt_safe(plain, key): return base64.urlsafe_b64encode(p3_encrypt(plain, key)) 使用了来自的尼斯加密库 base64

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

当我发送此电子邮件时,我希望能够轻松地从用户的行id(一个整数)生成此“一些随机字符串”。当用户点击这个链接时,生成那个整数

唯一的要求是“一些随机字符串”应该尽可能不透明,用户不可猜测


最后,这是我决定的

def p3_encrypt_safe(plain, key):
    return base64.urlsafe_b64encode(p3_encrypt(plain, key))
使用了来自的尼斯加密库
base64安全编码的添加是我的。

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


或者,您可以计算电子邮件地址的SHA-256或SHA-512(或任何内容)散列,并将其与电子邮件地址本身一起存储在数据库中。这样,您就可以使用散列作为键来查找电子邮件地址。

您的最佳选择是生成用户数据的散列(单向函数)。例如,要生成用户行id的散列,可以使用以下内容:

>>> import hashlib
>>> hashlib.sha1('3').hexdigest()
'77de68daecd823babbb58edb1c8e14d7106e83bb'
但是,仅基于行id的伪随机字符串并不十分安全,因为用户可以轻松地反转这样一个短字符串的哈希(try)

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

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

如果您这样做,可能唯一的结果将是指向以下答案的链接:-),这不是一个证明,而是一个很好的提示,说明此哈希非常独特。

ID的SHA哈希比加密ID稍微容易处理。保存数据库中的所有哈希,并将您得到的哈希与其中一个进行比较。