你能帮我理解一下盐哈希函数吗?


Can you help me to understand salt hashing function?

我正在研究各种密码哈希技术,我发现了一个教程,它让我对某些点有点怀疑。特别是,我只是希望你能再次确认/解释一些事情。例如,我找到了以下函数。现在,如果我很好地理解了这是在做什么,它会生成一个盐,在这种情况下具有以下值:

$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有一些非常强大的内置密码函数:password_hash和password_verify

这些会为你生成盐,所以你不必跟踪它们。

更好和正确的答案可以在这里找到:PHP密码的安全哈希和盐