我正在创建一个随机密钥,然后我想使用一个好的算法对其进行加密,然后我想用这个加密密钥加密数据。我的代码是:
$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 的初始化向量
如何满足我的要求?
我想用一个好的算法加密它
您在问题中包含的代码段不安全。我强烈推荐:
- 不要使用 mcrypt。
- 有关如何安全加密,请参阅此链接答案中的示例代码。
但是你得到的错误是河豚CFB需要一个密钥和一个IV,而你只提供了一个密钥。
实际错误(Encryption mode requires an initialization vector of size 8
(不是无效的密钥大小,而是缺少 IV。
CFB 模式需要 IV(初始化向量(。IV大小通常与块大小相同,河豚为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 有许多可追溯到 2003 年的突出错误。在 PHP 7.2 中删除了不推荐使用的 mcrypt-extension。相反,请考虑使用化解或RNCryptor,它们提供了一个完整的解决方案,并且正在维护并且是正确的。
你的示例有很多内容,因为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);
对此进行了编辑,以更正不正确的变量名称。