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

Вы не можете его преобразовать, потому что Rijndael-256 не AES-256, а расширение OpenSSL не поставляется с поддержкой Rijndael-256.
AES-256 – это Rijndael-128 с 256-битным (32-байтовым) ключом.

К сожалению, вам придется повторно шифровать все ваши данные.

Изменить: Кроме того, у схемы, которую вы используете, есть некоторые проблемы:

  • У него нет аутентификации (HMAC – это самый простой способ сделать это в PHP)
  • В нем нет надлежащего заполнения (mcrypt-пэды с нулевыми байтами, вместо этого вам нужно что-то вроде дополнения PKCS # 5), которое требуется для безопасного шифрования в блочном режиме.
  • Это не байт-сейф (вы используете mb_substr() )

Хорошей новостью является то, что OpenSSL будет автоматически заполнять PKCS # 5, но вы должны пойти еще дальше и использовать сплошную библиотеку шифрования, такую ​​как defuse / php-encryption .