我生成一个由单个使用令牌组成的url,并通过电子邮件将其发送给用户。用户应该点击这个链接并重定向到一个页面,该页面将验证令牌并执行一些操作。存储的盐渍令牌和令牌比较
在数据库方面,我存储了这个令牌(出于安全原因散列和腌制)。问题是我在验证令牌时遇到了一些困难,因为我存储它的方式不能为同一标记生成相同的盐。因此,我无法将这种盐与我储存的盐进行比较。
# 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 = 'test'
>>> enc_token1 = make_password(token)
>>> enc_token2 = make_password(token)
>>> enc_token1 == enc_token2
False
但是,这并不能帮助我从我的数据库检索对应于令牌的条目,我无法验证它。
现在有件事我从来没有听说过; _带有盐渍的标记_。你想用这些令牌来番茄酱吗?...... –
除了所有的笑话外,散列和腌制的目的是不能从散列字符串中获取原始密码。由于密码经常以某种方式重用,并且希望密码在潜在违规后很长时间内保持秘密,所以需要密码。令牌可以简单地重置,然后攻击者绝对不会使用获取的令牌。正如您已经注意到的,没有有效的方法来查询盐渍和散列的标记。这就是为什么令牌通常以纯文本格式存储的原因。为了什么特定的安全原因,你想存储他们散列? – knbk