因此,随着时间的推移,mcrypt将在PHP 7.2中使用。当然,还有一种选择:openssl。
我发现很难使用AES 256 CBC和保留IV从mcrypt切换到openssl。我对密码学有点陌生,所以我并不是真的一无所知,但我了解一些基础知识。
假设我有以下代码
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?
您无法进行转换,因为Rijndael-256不是AES-256,并且OpenSSL扩展不附带Rijndael-256支持。 AES-256是具有256位(32字节)密钥的Rijndael-128。
不幸的是,您必须重新加密所有数据。
编辑:另外,您当前正在使用的方案存在一些问题:
mb_substr()
好消息是,OpenSSL将自动为您执行PKCS#5填充,但是您应该走得更远,并使用像defuse/php-encryption这样的可靠加密库。