作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
你们可能知道,扩展名 mcrypt 将在 php 7.1 中被弃用。
我用来维护我想最终迁移到这个版本的“遗留”应用程序,所以我运行了测试并验证我不能再获得 100% 的覆盖率,因为有一段代码使用了以下内容代码:
$key = 'sA*(DH';
// initialization vector
$iv = md5(md5($key));
$output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, $iv));
我尝试使用这段代码将这段代码移植到 openssl_encrypt
$key = md5('sA*(DH');
$iv = md5($key);
echo base64_encode(openssl_encrypt($data, "aes-256-cbc", $key, OPENSSL_RAW_DATA, $iv));
但是我有两个问题:
有人遇到过类似的问题(或知道如何解决吗?)
顺便说一句:我正在使用 PHP 的开发主版本(应该是 7.1.0 alpha 3)。
最佳答案
另一个经过测试的解决方案获取并返回 ANSI 文本以用 openssl_encrypt() 和 openssl_decrypt() 替换 Mcrypt 函数:
//Return encrypted string
public function stringEncrypt ($plainText, $cryptKey = '7R7zX2Urc7qvjhkr') {
$cipher = 'aes-128-cbc';
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt(
$plainText, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $cryptKey, $as_binary=true);
$encodedText = base64_encode( $iv.$hmac.$ciphertext_raw );
}
return $encodedText;
}
//Return decrypted string
public function stringDecrypt ($encodedText, $cryptKey = '7R7zX2Urc7qvjhkr') {
$c = base64_decode($encodedText);
$cipher = 'aes-128-cbc';
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ivlenSha2len = $ivlen+$sha2len;
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$plainText = openssl_decrypt(
$ciphertext_raw, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
}
return $plainText;
}
关于php - 使用 MCRYPT_RIJNDAEL_256 将 mcrypt_encrypt 替换为 openssl_encrypt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38359165/
我是一名优秀的程序员,十分优秀!