Mar*_*eld 24 security passwords reset-password
当用户忘记密码时,我想知道什么是更安全的选择
要么
除了后者使用额外的桌子之外,您认为更安全/更好的做法是什么?
Pas*_*TIN 21
如果您发送包含密码的电子邮件,则表示:
因此,在电子邮件中发送密码似乎并不安全......
作为用户,我觉得我的密码"更安全",包含某种令牌的链接会在一段时间后过期.
" 一段时间后过期 "部分很重要,顺便说一下:它确保如果有人在一段时间后点击链接(例如,访问用户邮箱的人),该链接将不会用于生成新密码.
当然,这意味着我不能只是" 在我的邮箱中搜索 "来找到密码 - 但我总是可以要求一个新的我再次忘记它^^
cee*_*yoz 10
相当困惑的是这里的其他答案.他们完全一样.两者都允许访问用户的帐户,两者都以纯文本形式发送,并且两者都是常用的.选择你喜欢的任何一个.
使用链接/密码后立即更改密码,并在24-72小时后使链接/密码过期.
发送一封电子邮件,其中包含在特定时间范围内过期的链接,用户可以在该时间范围内重置密码.
那一个,当然.
电子邮件始终处于清晰状态(可能您的站点连接可能不是),并且可以触摸更多计算机.将密码保留在电子邮件之外.临时重置令牌还意味着如果邮箱稍后被黑客入侵,则该令牌将不再使用.
除了后者使用额外的桌子,
它不必.您可以生成加密令牌,授权特定用户在特定时间范围内重置密码; 无需额外数据.
使用基于HMAC的消息验证代码(花式散列)的示例:
details= user_id+' '+token_expiry_timestamp
mac= hmac_sha2(server_secret, details)
token= details+' '+mac
Run Code Online (Sandbox Code Playgroud)
然后将其token作为邮件中可点击URL的一部分发送给用户.当您收到回拨时,请mac确定该用户应该使用服务器端密码的时间和时间,并针对传入的mac进行检查.如果匹配,则必须是您之前签署的密码请求.
user_id, token_expiry_timestamp, mac= token split on ' '
details= user_id+' '+token_expiry_timestamp
if hmac_sha2(server_secret, details)!=mac
complain
else if token_expiry_timestamp<now
complain
else
allow password for user_id to be changed
Run Code Online (Sandbox Code Playgroud)
这不需要任何状态,但您应该使用较短的过期时间,因为如果您不记录使用情况,则可以多次使用令牌.
人们似乎忽略的一个区别是 - 以某个Web应用程序为例 - 密码重置选项通常对访问某个站点的任何人都是开放的,并且知道他们想要重置密码的帐户的用户名/登录名.
通过在用户必须单击的电子邮件中发送链接以便能够重置其密码,您可以避免让用户意外或恶意地重置其他人的密码 - 所有这些都会发生,因为他们收到的电子邮件结尾,"如果您没有要求重置密码,请忽略此电子邮件."
即使它本身并不存在安全风险,但在没有确认的情况下重置密码可能是一个很大的麻烦.