【问题标题】:Unrecognized hash algorithm after upgrade to PHP 7.4升级到 PHP 7.4 后无法识别的哈希算法
【发布时间】:2019-12-04 15:04:17
【问题描述】:

我刚刚安装了 php 7.4 并尝试使用我的帐户访问,但出现错误。 有什么想法吗?

Notice: Core\Hash::needsRehash() Algorithm "" not supported. 

我也试过不工作

$algo = 'bcrypt';
$algo = 'argon2id';

功能

public static function needsRehash($hash, $algo = null)
{
  if (!isset($algo) || $algo == 'default') {
    $algo = PASSWORD_DEFAULT;
  } elseif ($algo == 'bcrypt') {
    $algo = PASSWORD_BCRYPT;
  } elseif ($algo == 'argon2id') {
    $algo = PASSWORD_ARGON2ID;
  }

  if (!is_int($algo)) {
    trigger_error('Core\Hash::needsRehash() Algorithm "' . $algo . '" not supported.');
  }

【问题讨论】:

  • 您自己的错误消息告诉您,$algo 为空(nullfalse 或空字符串)。也许您可以在您的功能中使用var_dump(func_get_args())debug_print_backtrace() 来获取更多信息。

标签: php hash php-7.4


【解决方案1】:

你检查!isset($algo),这意味着如果你传入一个空字符串,验证将失败。在这种情况下,我认为使用 !isset() 是不合适的,因为它始终设置为(除非它为 null - 但您可以改为显式测试)。

您可以检查empty($algo),或者参数是否等于null。检查empty() 将不仅仅检查空字符串和空值(见下文)。

if (empty($algo) || $algo == 'default') {
// or
if ($algo === null || $algo == 'default') {

isset():

确定一个变量是否被认为是设置,这意味着一个变量是否被声明并且不是 NULL。

empty():

判断一个变量是否被认为是空的。如果一个变量不存在或者它的值等于 FALSE,它就被认为是空的。如果变量不存在,empty() 不会生成警告。

【讨论】:

  • 这不是问题要问的。
【解决方案2】:

您正在检查$algo 是否为整数,但在 PHP 7.4 中这些常量不再是整数;它们是可为空的字符串。

来自PHP 7.4 Backward Incompatible Changes

密码哈希算法标识符现在是可为空的字符串,而不是 比整数。

  • PASSWORD_DEFAULT 为整数 1;现在是 NULL
  • PASSWORD_BCRYPT 为整数 1;现在 是字符串'2y'
  • PASSWORD_ARGON2I 是 int 2;现在是字符串 'argon2i'
  • PASSWORD_ARGON2ID 为整数 3;现在是字符串 'argon2id'

应用程序 正确使用常量 PASSWORD_DEFAULT、PASSWORD_BCRYPT、 PASSWORD_ARGON2I 和 PASSWORD_ARGON2ID 将继续发挥作用 正确。

您的代码没有正确使用它们。您假设它们是整数,并明确检查它们的值,但实际上您不需要。在 PHP7.4 中,您可以使用 password_algos() 检查您的 PHP 安装中是否存在该算法。在以前的 PHP 版本中,您可以使用defined(PASSWORD_ARGON2I) 检查算法是否已定义。

为了向后兼容,旧的整数值也被接受,但不应使用。只要坚持常数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2020-10-09
    • 2021-09-29
    • 2014-07-13
    相关资源
    最近更新 更多