gpt4 book ai didi

python - 存储的加盐 token 和 token 比较

转载 作者:太空宇宙 更新时间:2023-11-04 05:22:16 24 4
gpt4 key购买 nike

我正在生成一个由一次性使用 token 组成的 url,并通过电子邮件将其发送给用户。用户应该单击此链接并被重定向到一个页面,该页面将验证 token 并执行一些操作。

在数据库端,我存储了这个 token (出于安全原因,经过散列和加盐处理)。问题是我在验证 token 时遇到了一些困难,因为按照我存储它的方式,我无法为相同的 token 生成相同的盐。因此,我无法将这种盐与我储存的盐进行比较。

# Retrieving or creating object usertokens
usr, created = UserToken.objects.get_or_create(email=email)
# Adding a new token
token = uuid.uuid4().hex
usr.token = make_password(token) # Stores in the local database the salted and hashed token
usr.save()

我使用的这个 make_password 方法在 django.contrib.auth.hashers 中定义。

通过使用这种方法,我无法从同一个 token 生成两次相同的盐。

>>> token = 'test'
>>> enc_token1 = make_password(token)
>>> enc_token2 = make_password(token)
>>> enc_token1 == enc_token2
False

然而,这并不能帮助我从我的数据库中检索与 token 对应的条目,我无法验证它。

最佳答案

对两个散列和加盐标记使用简单的字符串相等性检查是行不通的。 Django docs for password managementdjango.contrib.auth.hashers 命名空间中提供一个非常简单的方法来为您处理所有这些:

>>> token = 'test'
>>> enc_token1 = make_password(token)
>>> check_password('test', enc_token1)
True

check_password 方法在幕后做了一些事情,比如检查散列算法是否已经改变。它返回实现 BasePasswordHasher 基类的算法的 verify 方法的结果。这是来自 source of the PBKDF2PasswordHasher 的实现示例:

def verify(self, password, encoded):
algorithm, iterations, salt, hash = encoded.split('$', 3)
assert algorithm == self.algorithm
encoded_2 = self.encode(password, salt, int(iterations))
return constant_time_compare(encoded, encoded_2)

请注意如何通过拆分 '$' 上的 encoded_string 找到盐,因为 Django docs note那个

The password attribute of a User object is a string in this format:

<algorithm>$<iterations>$<salt>$<hash>

关于python - 存储的加盐 token 和 token 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39858364/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com