加密导致无效密钥大小错误[重复]

Posted

技术标签:

【中文标题】加密导致无效密钥大小错误[重复]【英文标题】:Encrypting gives error for invalid key size [duplicate] 【发布时间】:2019-03-24 14:48:39 【问题描述】:

我正在创建一个随机密钥,然后我想用一个好的算法对其进行加密,然后我想用这个加密的密钥加密数据。我的代码是:

$iv=16; //128bits
$datakey = base64_encode(openssl_random_pseudo_bytes($iv,$strong));
$datakey = md5($datakey);
$finaldata= mcrypt_encrypt(MCRYPT_BLOWFISH, $datakey, $stringtobeencoded, MCRYPT_MODE_CFB);

错误:

加密模式需要一个大小为 8 的初始化向量

如何完成我的要求?

【问题讨论】:

【参考方案1】:

我想用一个好的算法来加密它

您在问题中包含的 sn-p 不安全。我强烈推荐:

    Don't use mcrypt。 Refer to the example code in this linked answer for how to encrypt securely。

但是你得到的错误是 Blowfish-CFB 需要一个密钥和一个 IV,而你只提供了一个密钥。

【讨论】:

【参考方案2】:

你的例子有很多事情要做,因为 mcrypt_* 已被弃用,这个例子使用 openssl_* 函数代替。要跳过 IV 创建(不太安全但更容易),请使用以下命令:

$plainText = 'Hello world';
$key  = 'my-secret-encrpytion-key';
$algo = 'BF-CFB'; // blowfish cfb

$cypherText = openssl_encrypt($plainText, $algo, $key);
echo base64_encode($cypherText); // ZTVtdWNMRUp5N1dwZ2NFPQ==

echo openssl_decrypt($cypherText, $algo, $key);

对于更完整的实现,包括生成 $iv,就像您在原始问题中尝试做的那样,以下代码将起作用:

$plainText = 'Hello world';
$key  = 'my-secret-encrpytion-key';
$algo = 'BF-CFB'; // blowfish cfb

$ivLen = openssl_cipher_iv_length($algo); // $ivLen = 8
$iv = openssl_random_pseudo_bytes($ivLen);
$cypherText = openssl_encrypt($plainText, $algo, $key, 0, $iv);

echo base64_encode($cypherText); // V3JtL1crWHZKL1lEeGJBPQ==

echo openssl_decrypt($cypherText, $algo, $key, 0, $iv);

已对此进行了编辑以更正不正确的变量名称。

【讨论】:

嗨,这里的 $cipher 是什么?它的价值从何而来? 它说:警告:openssl_encrypt():使用空的初始化向量 (iv) 可能不安全,不建议在 .... 如何避免这种情况? 对不起,应该是$algo;您的系统支持的可用算法之一,请参阅openssl_get_cipher_methods()中的可能值 使用第二个代码示例消除空初始化向量消息。 但是第二种方法的问题是每次执行操作时都会生成一个随机IV。我必须将 IV 存储在普通黑客也可以读取的数据库/文件/注册表中。所以我想在使用它们加密数据之前加密密钥和 IV。有什么想法吗?【参考方案3】:

实际的错误——Encryption mode requires an initialization vector of size 8——不是无效的密钥大小,而是缺少 IV。

CFB mode 需要一个 IV(初始化向量)。 IV 大小通常与块大小相同,Blowfish 为 64 位,AES 为 128 位。

通常最好不要使用 Blowfish 进行加密,即使它的作者现在也使用 AES。

当保存密码验证器时,仅使用哈希函数是不够的,并且仅添加盐对提高安全性无济于事。而是使用随机盐迭代 HMAC 约 100 毫秒的持续时间,然后将盐与哈希一起保存。最好使用PBKDF2Rfc2898DeriveBytesArgon2password_hashBcrypt 等函数或类似函数。使用 php 使用 password_hashpassword_verify,这对是安全且易于使用的。 关键是让攻击者花费大量时间通过蛮力寻找密码。

最好不要使用 PHP mcrypt,它是废弃软件,多年未更新,不支持标准 PKCS#7 (née PKCS#5) 填充,只有非标准的空填充,甚至不能与二进制数据一起使用。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。不推荐使用的 mcrypt 扩展在 PHP 7.2 中被删除。而是考虑使用defuse 或RNCryptor,它们提供了一个完整的解决方案并且正在维护并且是正确的。

【讨论】:

以上是关于加密导致无效密钥大小错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

小错误起归档是遇到ORA-00265: instance recovery required, cannot set ARCHIVELOG mode

Codemagic 错误 无效的加密密钥 - 加密的变量仅适用于创建它们的同一团队中的构建

JavaScript中易犯的小错误-------常见错误三:内存泄露

php 编译小错误

JavaScript中易犯的小错误-------常见错误七:原型继承问题

CSS网页布局中易犯的10个小错误