我正在尝试对密码重置进行验证过程,我使用了两个值:epoch time,我想使用用户的旧密码(pbkdf2)作为密钥
因为我不想得到非ASCII字符,所以我使用了SimpleEncode library,因为它的速度很快,因为它只有一个使用了密钥的BASE64,但问题是密码太长(196个字符),所以我得到了一个长密钥!
我所做的是拆分结果code = simpleencode.encode(key,asci)[::30]
,但这不是唯一的!
为了了解它是如何工作的,我尝试了Facebook的重置过程,但给出的是一个数字!所以这个过程是如何工作的,难道他们不使用一个密钥来让某人很难伪造一个链接来重置某人的密码吗?
更新:算法的工作原理:
1-使用epoche获取时间time.time()
2-生成epoche时间(用于URL)的Base64和epoch时间值+一个键,这个键是PBKDF2(密码)。
3-生成url www.example.com/reset/user/Base64(time.time())并发送这个url+the simpleencode.encode(key,asci)[::30]
4-当用户点击URL时,他把生成的代码,这个生成的代码,如果它与URL匹配,那么让他修改密码,否则,它就是一个忘记的URL!
不确定这是最好的方法,但我可能只是生成一个UUID4,它可以在URL中用于重置密码,并在'n'时间后过期。
您可以使用http://redis.io之类的方法来保存该键,并使用适当的用户ID值设置其生存时间。所以,当有东西从http://example.com/password-reset/8c05904f0051419283d1024fc5ce1a59传入时,它会查看它是否有效,如果有效,则允许更改以设置新密码。
如果您确实需要一个“验证pin”,那么请与令牌一起存储一个小的随机密钥,例如:
以及在重置链接上输入的请求。
目前最简单的方法是使用ItsDangerous库:
您还可以嵌入一个时间戳,以便非常容易地设置时间段,而不必涉及数据库或队列。它都是加密签名的,所以你可以很容易地看到它是否被篡改了。
相关问题 更多 >
编程相关推荐