确定 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
您实际上不必使用 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.
就在使用 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
您实际上不必使用 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.