我有以下代码在PHP 5.5.9上运行良好 .
function index()
{
echo $this->encryptText_3des('TEST','JHHKJH9879');
}
function encryptText_3des($plainText, $key) {
$key = hash("md5", $key, TRUE);
for ($x=0;$x<8;$x++) {
$key = $key.substr($key, $x, 1);
}
$padded = $this->pkcs5_pad($plainText,
mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC));
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC));
return $encrypted;
}
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
加密发生得很好 . 但是在5.6.9中,在mcrypt_encrypt的PHP文档中,他们提到了
不再接受无效的密钥和iv尺寸 . mcrypt_encrypt()现在将抛出警告,如果输入无效,则返回FALSE . 以前,键和IV用'\ 0'字节填充到下一个有效大小 .
如何在不改变加密算法的情况下使用第五个参数修改当前代码?
我试过了
$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
给$ iv作为第五个参数 .
但它没有成功 . 加密与早期加密不同 .
3 回答
不要模拟旧的PHP版本弱行为来初始化IV .
使用mcrypt_create_iv() .
他们为 reason 删除了自动零字节iv .
找到答案,以防任何人需要
手动传递第5个参数,这是早期版本自己做的!
我会建议你不要重新发明轮子,因为你的功能有许多加密工程缺陷 .
不要使用3DES,请使用AES . 无论您需要的密钥大小如何,AES的正确mcrypt常量都是
MCRYPT_RIJNDAEL_128
. Mcrypt is pretty terrible .不要将
md5()
用作密钥派生函数 . 如果您发现自己需要KDF(例如,因为您使用的是密码而不是存储加密密钥),请使用带有SHA-256的hash_pbkdf2()
.您正在加密但未验证您的密文 . Secret-key encryption without message authentication is NOT secure in any language!加密然后MAC请 .
如果您要使用mcrypt(我们对secure data encryption in PHP的建议是使用libsodium,如果可以;否则defuse/php-encryption;否则为openssl),请确保将正确的常量传递给
mcrypt_create_iv()
.Bad :
Good :