我正在通过各种密码哈希技术,我找到了一个教程,让我对某些观点有些怀疑。特别是,我只想再次确认/解释一些事情。例如我发现了以下功能。现在,如果我很清楚这是做什么的,它会生成一个盐,以防下列值:
$salt = sprintf("$2a$%02d$", $cost) . $salt; // if $cost = 10 and $salt 234, then it should output $2a$1002d$234?
其次,身份验证示例使用以下比较:
if ( crypt($password, $user->hash) === $user->hash )
它声明"使用哈希值散列密码作为salt返回相同的哈希" - 现在我检查了php文档并自然地说明了相同但我只是试图从理论上理解这个概念(即使我知道如何使用,如果我不理解它背后的逻辑,我也不喜欢重用它们)。
我的问题是为什么crypt($ password,$ hash)返回相同的$ hash值。我只是想了解它背后的逻辑。谢谢。
答案 0 :(得分:3)
PHP的crypt函数将所有属性打包成60个字符的字符串(对于BCrypt)。
$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | | |
| | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | |
| | salt = nOUIs5kJ7naTuTFkBy1veu (22 characters)
| |
| cost-factor = 10 = 2^10 iterations
|
hash-algorithm = 2y = BCrypt
现在,当您将存储的哈希值作为验证的第二个参数传递给函数时,将从此字符串中提取成本因子和salt,并将重复使用它来计算新哈希值。这个哈希值是可比的,因为使用的参数相同。
PHP函数password_hash()和password_verify()只是crypt函数的包装器,它将处理关键部分,如生成安全盐。
答案 1 :(得分:0)
拿你读的代码。扔掉它,烧掉它,杀死它。只是不要使用它。
PHP有一些非常强大的密码功能:password_hash和password_verify
这些将为您创造盐,因此您不必跟踪它们。
可在此处找到更好,更正确的答案:Secure hash and salt for PHP passwords