【发布时间】:2013-01-20 17:56:09
【问题描述】:
我正在尝试为密码重置进行验证过程,我使用的是两个值:纪元时间,并且我想使用用户的旧密码 (pbkdf2) 作为密钥,
因为我不想获取非 ASCII 字符,所以我使用了SimpleEncode library,因为它速度很快,因为它只是一个带有密钥的 BASE64,但问题是密码太长(196 个字符)所以我得到长键!
我所做的是拆分结果code = simpleencode.encode(key,asci)[::30],但这不会是唯一的!
为了了解它的工作原理,我尝试了 Facebook 重置过程,但给出的是一个数字!那么这个过程是如何运作的,他们不是使用密钥来让某人难以伪造链接来重置某人的密码吗?
更新:算法将如何工作:
1- 使用 epoche time.time()获取时间
2-生成纪元时间的Base64(用于URL)和纪元时间值+一个密钥,这个密钥是PBKDF2(密码)。
3- 生成 URL www.example.com/reset/user/Base64(time.time()) 并发送此 URL + simpleencode.encode(key,asci)[::30]
4-当用户点击URL时,他把生成的代码,这个生成的代码,如果和URL匹配,那么让他修改密码,否则就是忘记URL!
【问题讨论】:
-
如果您确认它还没有在数据库中并且它足够长以至于没有人会猜到它,它不需要是唯一的。
-
您应该不以任何形式将用户密码公开(哈希)作为重置令牌的一部分。这将允许攻击者学习哈希,然后他们可以尝试暴力破解。
-
您正在暴露 PBKDF2(密码)。如果“密码”很弱,这可以通过暴力破解来逆转,如果它实际上是用户的密码,则很可能是这样。
-
@AbdelouahabPp 这仍然是一个安全漏洞,只有在被利用之前,安全漏洞才不太可能被利用。只是在可以避免的时候不要介绍它们。您始终可以使用不同于用于存储密码的盐来安全地散列密码。
-
@AbdelouahabPp 另外,30 个字符的 base64 随机数据(即哈希)绝对“足够独特”。
标签: python registration password-recovery