mcrypt_encrypt(): 此算法不支持大小为 29 的密钥

mcrypt_encrypt(): Key of size 29 not supported by this algorithm

我有我 2011 年的旧代码,它计算哈希值

private static $key = 'G@W351T35.cz#€2011GAMESITES';

/**
 * Computes salted password hash.
 * @param  string
 * @return string
 */
public static function calculateHash($password)
{
    $text = $password;
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, self::$key, $text, MCRYPT_MODE_ECB, $iv);
    return base64_encode($crypttext);
}

当我尝试 运行 现在我得到一个错误:

Warning: mcrypt_encrypt(): Key of size 29 not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported in ..\Hash.php on line 27

我知道从 2011 年开始需要很长时间,现在可以有更好的方法,但我需要让它从以前的版本开始工作,以解决一些历史问题。我做错了什么? 我什至看不出 29 码是什么意思。

或者如果我仍然有一个函数,有没有办法破坏散列? 有了这个,我可以开始使用新的哈希计算方法。

感谢您的建议

$key 是密钥,长度必须是受支持的 16、24 或 32 字节大小。您传递的长度为 29 个字节,您需要使用适当大小的密钥。

该代码不是在计算哈希值,而是在加密 $text

它正在使用被认为不安全的 ECB 模式。请注意,ECB 模式不采用 iv $iv,因此创建一个没有意义。 CBC 模式更好,并且确实使用了 iv.

如果您真的想创建哈希,请使用 SHA-256 等哈希函数。如果您需要 "keyed" 或加盐哈希,请使用 HMAC。

甚至 "way back to 2011" 加密也没有用于创建哈希,从那以后真的没有任何新东西。

使用随机盐对 HMAC 进行迭代约 100 毫秒(盐需要与哈希一起保存)。使用 password_hash、PBKDF2、Bcrypt 和类似函数等函数。重点是让攻击者花费大量时间通过暴力破解找到密码。

参见 OWASP(开放 Web 应用程序安全项目)Password Storage Cheat Sheet

在 Security Stackexchange 上查看 How to securely hash passwords, The Theory

如果您查阅 the documentation for mcrypt_encrypt 中的变更日志,您应该会看到自 PHP 5.6.0...

Invalid key and iv sizes are no longer accepted. mcrypt_encrypt() will now throw a warning and return FALSE if the inputs are invalid. Previously keys and IVs were padded with '[=16=]' bytes to the next valid size.

因此,解决方案是将您的密钥替换为用空字符填充至 32 字节的密钥。

不幸的是,其中有一个非 ASCII 字符(欧元符号),因此有多种可能的编码方式。最好手动编码这个字符。在 Unicode 中,欧元符号的代码点为 U+20AC,这将转换为“\xE2\x82\xAC”(这解释了为什么 mcrypt 计算 29 个字节而不是 27 个字节),使您的新密钥成为

private static $key = 'G@W351T35.cz#\xE2\x82\xAC2011GAMESITES[=10=][=10=][=10=]';

请注意,我们必须为您的代码假设一些字符编码;我假定为 UTF-8。不太可能,但有可能,在 2011 年,它应该以另一种字符编码(例如 ISO-8859-1)进行编码,这导致欧元符号的编码非常不同。