我正在服务器上创建一个APi来重置用户的密码。
我想让它变得安全,以便有人不能简单地将数据发布到php脚本,它会重置别人的密码。所以为了做到这一点,我创建了一个sha256
的哈希。哈希有两种盐,看起来类似于:
hash("sha256","salt1".date("jS M Y H")."salt2")
所以,为了验证它我在页面上散列它并取最后32个字符,在API脚本中我有前32个字符。我将它们连接在一起进行验证,如果它与完整哈希匹配,则允许脚本执行。
这样可以正常工作,如果用户恰好在一小时后的59分钟加载公共页面,并在小时更改后提交,则可以预期。月份和年份也一样。
我不想简单地设置静态哈希,我希望它能够改变。有没有更好的方法或方法可以达到我想要的效果?
答案 0 :(得分:0)
你正朝着错误的方向前进,以解决潜在的问题。使用经过验证的方法:
如果用户想要在他们已经登录时更改他们的密码,显然服务器知道用户是谁 - 因为他们已经登录 - 并且只会改变当前用户的密码。
对于忘记密码系统,您需要一个带外机制来确认用户的身份,这意味着您通常会向他们发送一封电子邮件,其中包含用户必须提供的信息。他们试图重置密码。这通常意味着您生成一个长随机令牌(简单随机字节转换为十六进制或基本64或其他可通过明文传输的东西),将其存储在数据库中,通过电子邮件发送(例如链接reset.php?token=...
),当用户输入新密码并提交表单时,他们会将新密码和令牌发送到您的服务器。服务器现在查找该令牌,该令牌在数据库中应该是唯一的,因此知道用户尝试更改其密码。
这里的安全性来自于令牌太长且随机可猜测的假设,并且只有预期用户才能看到令牌(这意味着我们假设电子邮件是足够安全的通道来传输它)。您也可以在合理的时间(比如几个小时)之后或者在使用一次之后让令牌过期。
此处无需任何额外的哈希值。