如何安全存储哈希?

use*_*181 0 php security encryption hash cryptography

当用户想要重置密码时,会发送一封带有唯一URL的电子邮件,以便他可以重置.像这样:website.com/forgot.php?email'.$email.'&hash='.$thehash

$ thehash是存储在数据库中的每个用户的唯一哈希.

问题是$ thehash就像它在URL中使用的那样存储在数据库中.这就像用纯文本存储密码一样愚蠢.如果有人可以访问数据库,那么我将密码与sha512和安全盐一起存储并不重要,攻击者可以使用数据库中的所有值(电子邮件和哈希)访问所有帐户,更改用户的密码.

当我对用户密码进行哈希处理时,用户有一部分信息是在数据库中找不到的,那么明文密码就可以解决了.但现在,我不知道该怎么做,因为我没有在数据库中找不到任何独特的东西.那么解决这个问题的好方法是什么?如何安全存储哈希?

idm*_*adj 5

问题不在于您如何存储哈希值,而在于重置链接的工作方式.

由于您提到的原因,您不希望使用哈希来验证用户的密码重置.

请改用易腐令牌.每当用户请求重置密码时,生成一个令牌(256位应该足够)并将其哈希值与请求它的用户以及令牌创建日期时间一起存储在您的数据库中.将该令牌放入重置链接(而不是电子邮件+哈希).当用户单击该链接时,您的服务器将收到该令牌,找到相应的用户,并且可以安全地更改密码.

通过仅在您的数据库中存储令牌的哈希,但在电子邮件链接中使用未哈希的令牌,您确保即使攻击者仍然可以访问您的数据库,他也无法伪造自己的重置链接.

通过将用户单击链接的时间与生成令牌时存储的日期时间进行比较,您将能够控制重置链接的有效时间(并避免用户忘记删除电子邮件的情况,获取他的电子邮件)帐户遭到入侵,并让攻击者使用重置链接).

查看此Authlogic密码重置教程以获得完整实施.