【发布时间】:2019-03-11 08:48:17
【问题描述】:
我正在将旧版应用程序从 PHP 7.0 升级到 7.2,当我为 openssl 切换 mcrypt 时,我的解密功能不起作用。
我尝试了mcrypt is deprecated, what is the alternative? 之类的现有答案和https://gist.github.com/odan/c1dc2798ef9cedb9fedd09cdfe6e8e76 之类的 Gists,但我仍然无法使代码正常工作。
谁能解释我做错了什么?
旧代码
function decrypt($value, $key) {
$ivLength = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = substr($value, 0, $ivLength);
return rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', $key, true),
substr($value, $ivLength),
MCRYPT_MODE_CBC,
$iv
),
"\0"
);
}
新代码(不适用于现有输入)
function decrypt($value, $key) {
$ivLength = openssl_cipher_iv_length('AES-128-CBC');
$iv = substr($value, 0, $ivLength);
// Note: $key is hashed because it was hashed in the old encrypt function below
return openssl_decrypt(substr($value, $ivLength), 'AES-128-CBC', hash('sha256', $key, true), OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
}
就上下文而言,以下是旧代码加密值的方式:
function encrypt($value, $key) {
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM);
return $iv . mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', $key, true),
$value,
MCRYPT_MODE_CBC,
$iv
);
}
此外,$value 中的原始值在新代码中输出到错误日志时的长度是旧代码的两倍,并且看起来相似但字符更多。
【问题讨论】:
-
我很确定旧的加密和新的解密不会相互兼容
-
为什么要使用不同的方法来获取密钥?
additional_key也没有在任何地方定义 -
@Devon 哎呀,那不应该在那里,它已经被重构了。我从代码中删除了它。
-
您仍在对旧加密中的密钥进行哈希处理
-
@Devon 很好。我更新了代码,但它仍然不起作用,返回一个空字符串。