你能帮我理解盐哈希功能吗?

时间:2014-08-20 10:58:16

标签: php hash passwords salt

我正在通过各种密码哈希技术,我找到了一个教程,让我对某些观点有些怀疑。特别是,我只想再次确认/解释一些事情。例如我发现了以下功能。现在,如果我很清楚这是做什么的,它会生成一个盐,以防下列值:

$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值。我只是想了解它背后的逻辑。谢谢。

2 个答案:

答案 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_hashpassword_verify

这些将为您创造盐,因此您不必跟踪它们。

可在此处找到更好,更正确的答案:Secure hash and salt for PHP passwords