Подготовка к удалению Mcrypt в PHP 7.2
Так как время движется по mcrypt, это будет в PHP 7.2.
Конечно, есть альтернатива: 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?
Ответы
Ответ 1
Вы не можете его преобразовать, потому что Rijndael-256 не AES-256, а расширение OpenSSL не поставляется с поддержкой Rijndael-256.
AES-256 - это Rijndael-128 с 256-битным (32-байтовым) ключом.
К сожалению, вам придется повторно шифровать все ваши данные.
Изменить: Кроме того, у схемы, которую вы используете, есть некоторые проблемы:
- Отсутствует аутентификация (HMAC - это самый простой способ сделать это на PHP)
- У него нет надлежащего заполнения (mcrypt pads с нулевыми байтами, вместо этого вам нужно что-то вроде дополнения PKCS # 5), что необходимо для безопасного шифрования блочного режима.
- Он не байт-безопасен (вы используете
mb_substr()
)
Хорошей новостью является то, что OpenSSL будет автоматически заполнять PKCS # 5, но вы должны пойти еще дальше и использовать надежную библиотеку шифрования, например defuse/php-encryption.