加密导致无效密钥大小错误[重复]
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 毫秒的持续时间,然后将盐与哈希一起保存。最好使用PBKDF2
、Rfc2898DeriveBytes
、Argon2
、password_hash
、Bcrypt
等函数或类似函数。使用 php 使用 password_hash
和 password_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中易犯的小错误-------常见错误三:内存泄露