php - 你能帮我理解盐散列函数吗?

标签 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 )

它指出“用它的哈希值对密码进行哈希处理,因为盐返回相同的哈希值” - 现在我检查了 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/

相关文章:

php - 共享主机上的 GeoIP

php - phpmyadmin可以使用pdo_mysql访问mysql吗?

javascript - Joomla 将脚本从 View 添加到头部脚本的底部

Ruby - 如何将字符串解析为哈希数组

java - HashSet 的 Hashing 是如何工作的?

Neo4J:命令失败:未设置初始密码,因为检测到实时 Neo4j 用户

php - 用于密码散列的 Crypt。河豚产生奇怪的输出

php - 使用 Symfony 3 cURL 到 DropBox

php - 亚马逊 S3 重复数据删除?

github - GitHub 如何知道我的密码较弱?