升级到PHP 7.4后无法识别的哈希算法

时间:2019-12-04 15:04:17

标签: php hash php-7.4

我刚安装了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.');
  }

2 个答案:

答案 0 :(得分:2)

您检查!isset($algo),这意味着如果传递空字符串,则验证将失败。在这种情况下,我认为使用!isset()是不合适的,因为它总是设置的(除非它为null,但是您可以显式地对其进行测试)。

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

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

isset()

  

确定是否将变量视为集合,这意味着是否声明了变量并且该变量不同于NULL。

empty()

  

确定变量是否被认为是空的。如果变量不存在或其值等于FALSE,则将其视为空。如果变量不存在,则empty()不会生成警告。

答案 1 :(得分: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为int 3;现在是字符串'argon2id'
  •   
     

应用程序   正确使用常量PASSWORD_DEFAULT,PASSWORD_BCRYPT,   PASSWORD_ARGON2I和PASSWORD_ARGON2ID将继续运行   正确。

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

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