1

就在使用之前password_hash(),我检查 if PASSWORD_DEFAULT===PASSWORD_BCRYPT以查看是否需要在密码散列之前对密码进行一些清理(Argon2 不需要这个)。

我只是先通过快速散列传递它,因为 bcrypt 存在 NULL 字符和超过 72 个字符的密码问题(更多信息不同的示例)。

但在 PHP 7.4 中,该常量PASSWORD_DEFAULT现在设置为NULL.

那么我怎么知道password_hash()会使用什么算法呢?

4

2 回答 2

2

这是一个有趣的问题,我相信还没有标准功能。这不是一个大问题,因为散列本身包含一个标识符,告诉我们使用了哪种散列算法。这里要注意的重要一点是,它PASSWORD_DEFAULT是一个常数。常数不变。

要弄清楚在使用默认常量时使用了哪种算法(过去和现在都是 bcrypt),您需要生成一些虚拟哈希并查看它的开头。我们甚至可以使用一个不错的辅助函数password_get_info()

$hashInfo = password_get_info(password_hash('pass', PASSWORD_DEFAULT, [ 'cost' => 4 ] ));
echo $hashInfo['algo']; // should return either 1 or 2y

if($hashInfo['algo'] === PASSWORD_BCRYPT) {
    // will be true for PHP <= 7.4
}
于 2019-12-10T21:46:13.583 回答
0

编辑

自 PHP 7.4.3 起,您可以继续使用PASSWORD_DEFAULT === PASSWORD_BCRYPT

https://3v4l.org/nN4Qi


您实际上不必使用password_hash两次。更好更快的方法是提供一个已经散列的值,并使用 password_needs_rehashBcrypt函数检查它,以查看默认算法是否已更改。PASSWORD_DEFAULT

bcrypt 算法是 PHP 5.5.0 的默认算法

例如:

$hash = '$2y$10$ra4VedcLU8bv3jR0AlpEau3AZevkQz4Utm7F8EqUNE0Jqx0s772NG'; // Bcrypt hash

// if it doesn't need rehash then the default algo is absolutely Bcrypt
if (! password_needs_rehash($hash, PASSWORD_DEFAULT)) {
    // do some clean up
}

注意:确保哈希值($hash) 与password_needs_rehash的第三个参数中提供的成本相同,否则它会认为哈希过时并需要重新哈希,因为成本已经改变。

于 2019-12-26T06:29:32.403 回答