为了账号安全,请及时绑定邮箱和手机立即绑定

yii CPasswordHelper:hashPassword和verifyPassword

yii CPasswordHelper:hashPassword和verifyPassword

慕田峪9158850 2019-12-05 15:42:46
我想我在这里错过了一些关键的事情。在CPasswordHelper::hashPassword函数中,我们有以下几行:$salt=self::generateSalt($cost);  $hash=crypt($password,$salt);  return $hash;在CPasswordHelper::verifyPassword这行中:$test=crypt($password,$hash);  return self::same($test, $hash);那盐呢?据我了解,它甚至没有被保留,但没有任何意义,所以我想我还没有完全理解它
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

CPasswordHelper的工作方式类似于PHP的函数password_hash()和password_verify(),它们是crypt()函数的包装器。生成BCrypt哈希时,您将得到一个包含盐的60个字符的字符串。


// Hash a new password for storing in the database.

$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

变量$ hashToStoreInDb现在将包含一个哈希值,如下所示:


$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa

 |  |  |                     |

 |  |  |                     hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa

 |  |  |

 |  |  salt = nOUIs5kJ7naTuTFkBy1veu

 |  |

 |  cost-factor = 10 = 2^10 iterations

 |

 hash-algorithm = 2y = BCrypt

您可以在第三个盐之后找到盐$,它由password_hash()使用操作系统的随机源自动生成。因为盐包含在结果字符串中,所以函数password_verify()或实际上是包装的crypt函数可以从那里提取盐,并可以使用相同的盐(和相同的成本因数)计算哈希。那么这两个哈希是可比较的。


// Check if the hash of the entered login password, matches the stored hash.

// The salt and the cost factor will be extracted from $existingHashFromDb.

$isPasswordCorrect = password_verify($password, $existingHashFromDb);


查看完整回答
反对 回复 2019-12-05
?
喵喔喔

TA贡献1735条经验 获得超5个赞

盐作为哈希的一部分存储。


查看完整回答
反对 回复 2019-12-05
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

由生成的散列CPasswordHelper包含一个$符号,后跟所选算法的代码,另一个$是成本因素(注意:如果看到10,则实际上意味着2 ^ 10次迭代!),另一个$是a固定数量的字符为“ salt”,然后直接加上实际的哈希。

查看完整回答
反对 回复 2019-12-05
  • 3 回答
  • 0 关注
  • 945 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信