准备在PHP 7.2中删除Mcrypt

所以随着时间的推移,mcrypt将在PHP 7.2中。 当然还有一个select:openssl。

我发现很难从mcrypt切换到openssl,使用AES 256 CBC和保留IV。 我对密码学有点新鲜,所以我并不是很了解所有的东西,但我理解这些基础知识。

假设我有以下代码

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); } 

我怎样才能“转换”这个代码使用openSSL insted mcrypt?

您不能转换它,因为Rijndael-256不是AES-256,OpenSSL扩展没有提供Rijndael-256支持。
AES-256是带有256位(32字节)密钥的Rijndael-128。

不幸的是,你将不得不重新encryption你的所有数据。

编辑:此外,您正在使用的scheme有一些问题:

  • 它缺乏身份validation(HMAC是在PHP中执行它的最简单的方法)
  • 它缺less适当的填充(mcrypt填充零字节;您需要类似PKCS#5填充代替),这是块模式encryption是安全所需的。
  • 这不是字节安全的(你正在使用mb_substr()

好消息是OpenSSL会自动为你做PKCS#5填充,但是你应该更进一步,使用像defuse / php-encryption这样的可靠encryption库。