准备在PHP 7.2中删除Mcrypt [英] Preparing for removal of Mcrypt in PHP 7.2
问题描述
因此随着时间的推移,mcrypt将在PHP 7.2中使用. 当然,还有一种选择:openssl.
So as time moves on mcrypt will go in PHP 7.2. Of course there is an alternative: openssl.
我发现很难使用AES 256 CBC和保留IV从mcrypt切换到openssl.我对密码学有点陌生,所以我并不真正了解所有内容,但我了解基本知识.
I find it difficult to switch from mcrypt to openssl, using AES 256 CBC and preserving IVs. I am sort of new to cryptography, so I don't really know everything, but I understand the basics.
假设我有以下代码
function encrypt($masterPassword, $data)
{
$keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);
$key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
return base64_encode($iv . $encrypted);
}
function decrypt($masterPassword, $base64)
{
$keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize);
$data = base64_decode($base64);
$iv = substr($data, 0, $ivSize);
$encrypted = substr($data, $ivSize, strlen($data));
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CBC, $iv);
return trim($decrypted);
}
如何转换"此代码以使用由mcrypt插入的openssl?
How can I "convert" this code to use openssl insted of mcrypt?
推荐答案
您无法进行转换,因为Rijndael-256不是AES-256,并且OpenSSL扩展不附带Rijndael-256支持. > AES-256是具有256位(32字节)密钥的Rijndael-128.
You can't convert it, because Rijndael-256 is not AES-256, and the OpenSSL extension doesn't ship with Rijndael-256 support.
AES-256 is Rijndael-128 with a 256-bit (32-byte) key.
不幸的是,您必须重新加密所有数据.
Unfortunately, you'll have to re-encrypt all of your data.
另外,您当前正在使用的方案存在一些问题:
Also, the scheme you're currently using has some problems:
- 它缺乏身份验证(HMAC是用PHP进行身份验证的最简单方法)
- 它缺少适当的填充(具有零字节的mcrypt填充;您需要像PKCS#5填充之类的东西),这是块模式加密安全所必需的.
- 它不是字节安全的(您正在使用
mb_substr()
)
好消息是OpenSSL将自动为您执行PKCS#5填充,但您应该走得更远,并使用
The good news is that OpenSSL will do PKCS#5 padding for you automatically, but you should go even further and use a solid encryption library like defuse/php-encryption.
这篇关于准备在PHP 7.2中删除Mcrypt的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!