Abd*_* Pp 13 python registration password-recovery
我正在尝试为密码重置进行验证过程,我使用的是两个值:纪元时间,我想使用用户的旧密码(pbkdf2)作为密钥,
由于我不想获得非ASCII字符,我使用的是SimpleEncode库,因为它很快,因为它只是一个使用了密钥的BASE64,但问题是密码太长(196个字符)所以我得到一个长密钥!
我所做的就是分割结果code = simpleencode.encode(key,asci)[::30]
,但这不是唯一的!
为了了解它是如何工作的,我尝试了Facebook重置过程,但给出的是一个数字!那么这个过程是如何工作的,难道他们不会使用密钥来让某人伪造链接来重置某人的密码吗?
更新:算法将如何工作:
1-使用epoche获得时间 time.time()
2-生成epoche时间的Base64(用于URL)和纪元时间值+一键,此键为PBKDF2(密码).
3-生成网址www.example.com/reset/user/Base64(time.time())并发送此网址+ simpleencode.encode(key,asci)[::30]
4-当用户点击URL时,他把生成的代码,这个生成的代码,如果它与URL匹配,那么让他修改密码,否则,它是一个忘记URL!
Jon*_*nts 30
不确定这是最好的方法,但我可能只生成一个UUID4,可以在URL中使用它来重置密码并在'n'时间后过期.
>>> import uuid
>>> uuid.uuid4().hex
'8c05904f0051419283d1024fc5ce1a59'
Run Code Online (Sandbox Code Playgroud)
您可以使用类似http://redis.io的东西来保存该密钥,并使用适当的用户ID值并设置其生存时间.因此,当某些内容来自http://example.com/password-reset/8c05904f0051419283d1024fc5ce1a59时,它会查看它是否有效,如果是,则允许更改设置新密码.
如果你确实想要一个"验证引脚",那么随着令牌一起存储一个小的随机密钥,例如:
>>> from string import digits
>>> from random import choice
>>> ''.join(choice(digits) for i in xrange(4))
'2545'
Run Code Online (Sandbox Code Playgroud)
并请求在重置链接上输入.
Doo*_*beh 18
到目前为止最简单的方法是使用ItsDangerous库:
您可以序列化并签署用户ID,以便将简报取消订阅到URL中.这样,您无需生成一次性令牌并将其存储在数据库中.帐户和类似事物的任何激活链接都是一样的.
您还可以嵌入时间戳,因此可以非常轻松地设置时间段而无需涉及数据库或队列.它都是加密签名的,因此您可以轻松查看它是否被篡改.
>>> 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10024 次 |
最近记录: |