我有一个基于CakePHP1.2构建的应用程序,它存储了一些加密数据。我正在重建应用程序,需要解密新应用程序中的数据以更新其加密。CakePHP1.2中用于加密数据的密码和方法在PHP7.1中不可用。有人知道我可以在PHP7.1环境中解密数据的方法吗,这样就可以用新技术对数据进行加密了?
加密/解密数据的当前方法
function _cryptData(&$data, $direction) {
$ivSize = mcrypt_get_iv_size(MCRYPT_TRIPLEDES, MCRYPT_MODE_CBC);
switch ($direction) {
case 'encrypt':
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
$data = base64_encode($iv) . '|' . base64_encode(mcrypt_encrypt(MCRYPT_TRIPLEDES, Configure::read('CakeMix.cryptKey'), $data, MCRYPT_MODE_CBC, $iv));
break;
case 'decrypt':
list($iv, $encoded) = explode('|', $data);
$data = mcrypt_decrypt(MCRYPT_TRIPLEDES, Configure::read('CakeMix.cryptKey'), base64_decode($encoded), MCRYPT_MODE_CBC, base64_decode($iv));
break;
}
}
您问题中显示的代码似乎是定制的,即非CakePHP核心代码,因此这似乎更像是与PHP相关的。
Mcrypt已被弃用,但在PHP7.1中仍然可用,它仅在PHP7.2中被删除。Mcrypt还可以与php7.2一起使用,您只需手动安装它,因为它已被移动到PECL,请参阅安装php7中的示例问题。2-mcrypt。您还可以使用phpseclib/mcrypt_compat之类的多填料。因此,您应该能够继续使用Mcrypt进行解密,并将数据移植到您喜欢的任何加密。
此外,通常也可以使用OpenSSL对数据进行解密,尽管空填充似乎存在缺陷,例如请参见使用OpenSSL解密mcrypt。以下是一个基本示例:
$data = openssl_decrypt(
base64_decode($encoded),
'des-ede3-cbc',
Configure::read('CakeMix.cryptKey'),
OPENSSL_RAW_DATA | OPENSSL_NO_PADDING,
base64_decode($iv)
);
有很多关于用OpenSSL替换MCrypt的主题,您可能想了解更多选项。