在python中生成重置令牌的最佳方法是什么?

2024-05-08 22:10:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试对密码重置进行验证过程,我使用了两个值: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!


Tags: key用户url密码time过程时间密钥
2条回答

不确定这是最好的方法,但我可能只是生成一个UUID4,它可以在URL中用于重置密码,并在'n'时间后过期。

>>> import uuid
>>> uuid.uuid4().hex
'8c05904f0051419283d1024fc5ce1a59'

您可以使用http://redis.io之类的方法来保存该键,并使用适当的用户ID值设置其生存时间。所以,当有东西从http://example.com/password-reset/8c05904f0051419283d1024fc5ce1a59传入时,它会查看它是否有效,如果有效,则允许更改以设置新密码。

如果您确实需要一个“验证pin”,那么请与令牌一起存储一个小的随机密钥,例如:

>>> from string import digits
>>> from random import choice
>>> ''.join(choice(digits) for i in xrange(4))
'2545'

以及在重置链接上输入的请求。

目前最简单的方法是使用ItsDangerous库:

You can serialize and sign a user ID for unsubscribing of newsletters into URLs. This way you don’t need to generate one-time tokens and store them in the database. Same thing with any kind of activation link for accounts and similar things.

您还可以嵌入一个时间戳,以便非常容易地设置时间段,而不必涉及数据库或队列。它都是加密签名的,所以你可以很容易地看到它是否被篡改了。

>>> from itsdangerous import TimestampSigner
>>> s = TimestampSigner('secret-key')
>>> string = s.sign('foo')
>>> s.unsign(string, max_age=5)
Traceback (most recent call last):
  ...
itsdangerous.SignatureExpired: Signature age 15 > 5 seconds

相关问题 更多 >