阅读this excellent answer约密码哈希,不知道如何实现它:如何正确实现hash_hmac?
生成每个用户的随机数;仅这一件就击败了彩虹桌。这是一个随机数,它取决于范围,扩展了产生的散列数。
那么除了用户的密码在我的数据库中存储唯一的令牌吗?
的示例代码在原岗位:
function hash_password($password, $nonce) {
global $site_key;
return hash_hmac('sha512', $password . $nonce, $site_key);
}
我如何可以验证此代码密码?让我来解释:
当用户提交自己的密码,我需要生成它的散列,以检查其中的电子邮件地址和哈希密码匹配现有的数据库行。当我对用户'$nonce
一无所知时,我如何选择这一行?我错过了什么吗?也许我需要通过只有他的电子邮件地址选择用户,然后再验证密码散列?
顺便说一句,你推荐这种哈希方法?
您不需要选择使用密码作为选择标准的用户。只需根据电子邮件地址或登录等独特特征选择用户,然后再检查密码。也见有关哈希想法的一个相关问题(免责声明:我就此回答):http://stackoverflow.com/questions/3787346/email-address-as-password-salt/3787414#3787414 – Archimedix 2011-04-07 10:27:38
顺便说一句,通过用户名只选择还有一个好处,你可以显示“用户不存在”或“密码无效”,这取决于错误,这极大地增加了你网站的可用性。有时候,无论出于何种原因,你都必须使用不同的用户名,并且经过很长时间,你可能会尝试使用旧的密码和大量的密码,因为它只是说“登录失败”。有了“用户不存在”的错误,这将不是必需的 – ThiefMaster 2011-04-07 10:33:23
@Archimedix感谢您的回复。顺便说一句,抱歉,但我看不出将系统范围的盐添加到明文密码或密钥之间的区别。你能说明一下吗? – fabrik 2011-04-07 10:48:37