我正在研究各种密码散列技术,并且发现了一个教程,该教程让我对某些点有点怀疑。特别是,我希望您能重新确认/解释一些事情。例如,我发现了以下函数。现在,如果我很好地理解这是在做什么,它会生成一种盐,如果具有以下值:
$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 )
它指出“用它的哈希值对密码进行哈希处理,因为盐返回相同的哈希值” - 现在我检查了 php 文档,自然它的状态是相同的,但我只是想从理论上理解这个概念(我不喜欢即使我知道如何使用东西(如果我不理解其背后的逻辑),也可以重用它。
我的问题是为什么 crypt($password, $hash) 返回相同的 $hash 值。我只是想了解其背后的逻辑。谢谢。
最佳答案
PHP 的 crypt 函数会将所有属性打包到一个 60 个字符的字符串中(对于 BCrypt)。
$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | | |
| | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | |
| | salt = nOUIs5kJ7naTuTFkBy1veu (22 characters)
| |
| cost-factor = 10 = 2^10 iterations
|
hash-algorithm = 2y = BCrypt
现在,当您将存储的哈希值作为第二个参数传递给函数进行验证时,将从该字符串中提取成本因子和盐,并将其重新用于计算新的哈希值。该哈希值具有可比性,因为使用了相同的参数。
PHP 函数 password_hash()和 password_verify()只是 crypt 函数的包装器,并将处理关键部分,例如生成安全盐。
关于php - 你能帮我理解盐散列函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25402957/