确定 PASSWORD_DEFAULT 中的内容 PHP 7.4

Identifying what PASSWORD_DEFAULT will be in PHP 7.4

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

我只是先通过快速哈希传递它,因为 bcrypt 存在 NULL 字符和超过 72 个字符 (more info, and a different example) 的密码问题。

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

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

这是一个有趣的问题,我相信目前还没有标准函数。这不是一个大问题,因为散列本身包含一个标识符,告诉我们使用了哪种散列算法。这里要注意的重要一点是 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
}

编辑

从 PHP 7.4.3 开始,您可以继续使用 PASSWORD_DEFAULT === PASSWORD_BCRYPT

https://3v4l.org/nN4Qi


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

bcrypt algorithm is the default as of PHP 5.5.0

例如:

$hash = 'y$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
}

Note: make sure that the hash value($hash) has the same cost provided in password_needs_rehash's third parameter, otherwise it will consider the hash outdated and need rehash since the cost has changed.