【问题标题】:Replace deprecated mcrypt_cbc with mcrypt_encrypt将弃用的 mcrypt_cbc 替换为 mcrypt_encrypt
【发布时间】:2016-09-12 01:29:13
【问题描述】:

我有一个旧算法来编码我想在 PHP 7 中使用的密码

public function encriptarPass($cadena)
{
     $extra = (strlen($cadena)%8);
     for ($i = $extra; $i < 8; $i++) {
        $cadena .= chr(8-$extra);
     }
     $key = "stack";
     $iv = "stack";                    

     return strtoupper(bin2hex(mcrypt_cbc(MCRYPT_3DES, $key, $cadena, MCRYPT_ENCRYPT, $iv)));
}

我尝试将 mcrypt_cbc 替换为 mcrypt_encrypt 并收到此错误:

mcrypt_encrypt(): 模块初始化失败

我想更新算法以使用存储在数据库中的旧密码。 我知道我应该使用 bcrypt 或其他算法,但目前我需要更新这个旧算法

【问题讨论】:

  • 最好不要使用mcrypt,它是废弃软件,多年未更新,不支持标准PKCS#7(née PKCS#5)填充,只有非标准空填充可以'甚至不能与二进制数据一起使用。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。请考虑使用 defuse,它正在维护并且是正确的。

标签: php algorithm mcrypt


【解决方案1】:

这两个函数将返回相同的结果。

function encriptarPass($cadena){
    $extra = (strlen($cadena)%8);
    for($i = $extra; $i < 8; $i++) {
        $cadena .= chr(8-$extra);
    }
    $key = "stack";
    $iv = "stack111";
    return strtoupper(bin2hex(mcrypt_cbc(MCRYPT_3DES, str_pad($key, 24, "\0"), $cadena, MCRYPT_ENCRYPT, $iv)));
}

function encriptarPass2($cadena){
    $extra = (strlen($cadena)%8);
    for($i = $extra; $i < 8; $i++) {
        $cadena .= chr(8-$extra);
    }

    $key = "stack";
    $iv = "stack111";
    return strtoupper(bin2hex(mcrypt_encrypt(MCRYPT_3DES, str_pad($key, 24, "\0"), $cadena, MCRYPT_MODE_CBC, $iv)));
}

例子:

echo encriptarPass('test987x'); // Writes 10C9B50682CC21909AC4346CDFC4586E
echo encriptarPass2('test987x'); // Writes 10C9B50682CC21909AC4346CDFC4586E

【讨论】:

  • 它正在工作,但现在我遇到了这个问题:mcrypt_encrypt(): Key of size 9 not supported by this algorithm. Only keys of size 24 supported 有什么方法可以用 9 号键使用它?
  • 在 PHP 5.6 中,他们改变了行为,不再接受无效的密钥大小。在 5.6 之前,键是用 '\0' 填充的。我已经编辑了答案,用“\0”填充键。
猜你喜欢
  • 2016-11-16
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 2022-11-11
  • 2012-03-20
  • 2021-09-22
  • 2020-09-20
  • 2017-09-14
相关资源
最近更新 更多