Подготовка к удалению 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.