【发布时间】:2014-01-15 13:52:14
【问题描述】:
我一直在阅读有关 php 5.3+ 密码哈希的信息 - 但有几个问题,如果我很愚蠢,请原谅。似乎制作强用户密码哈希的一大抓点是使用随机盐而不是静态盐。如果我检查用户登录,肯定我必须以某种方式使用盐的副本(存储在数据库中)来检查?如果是这样,我是使用安全盐函数(bcrypt salt functions)并将该字符串存储在数据库中(并在每次新登录时重新创建)还是什么?
我有这个:
$options = [
'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
];
当我回显 $options['salt'] 时,我得到了我可能无法存储在数据库中的奇怪字符。我习惯了在数据库中存储随机盐并将其(静态)用于用户登录身份验证的旧(不安全)方法,但动态/随机盐让我有点失望。我错过了什么?随机盐每次都会改变,所以如果我现在存储它,并且用户重新登录哈希会不同,所以数据库密码不会与发布的密码匹配..??
谢谢~
【问题讨论】:
-
如果数据库暴露给第三方用户,随机加盐没有任何优势。一旦哈希和盐对攻击者可见,随机的就没有用了。你最好使用一个静态的,保存在你的代码中。从统计数据上破解 Web 服务器比数据库更难。
-
你不使用password_hash()来验证用户密码,只是生成salt并存储密码;您使用password_verify() 来验证存储在数据库中的密码:password_verify() 函数使用盐处理检查
-
这样的? SetEnv WEBSITE_SALT 232lhsdfjaweufha32i4fv4239tauvkjn 来自:stackoverflow.com/questions/5032341/…
-
@MarkBaker - 我明白这一点,但使用 password_verify 必须提供静态(非随机)盐来检查先前存储的哈希。这就是我问题的症结所在,除非我错过了什么?
-
单独存放盐是没有意义的。它已经包含在
password_hash()返回的哈希中。只需将整个字符串作为第二个参数传递给password_verify()。顺便说一句:这些函数从 PHP 5.5+ 开始可用。
标签: php hash passwords authentication