php openssl mcrypt php-7.1

Preparación para la eliminación de Mcrypt en PHP 7.2



openssl php-7.1 (1)

Entonces, a medida que pasa el tiempo, mcrypt irá en PHP 7.2. Por supuesto que hay una alternativa: openssl.

Me resulta difícil cambiar de mcrypt a openssl, usando AES 256 CBC y preservando IVs. Soy un poco nuevo en la criptografía, por lo que realmente no lo sé todo, pero entiendo lo básico.

Digamos que tengo el siguiente código

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); }

¿Cómo puedo "convertir" este código para usar openssl en lugar de mcrypt?


No puede convertirlo, porque Rijndael-256 no es AES-256, y la extensión OpenSSL no se entrega con soporte Rijndael-256.
AES-256 es Rijndael-128 con una clave de 256 bits (32 bytes).

Lamentablemente, tendrá que volver a cifrar todos sus datos.

Editar: Además, el esquema que está utilizando actualmente tiene algunos problemas:

  • Carece de autenticación (los HMAC son la forma más fácil de hacerlo en PHP)
  • Carece de relleno adecuado (mcrypt pads con cero bytes; necesita algo como el relleno PKCS # 5 en su lugar), que es necesario para que el cifrado en modo bloque sea seguro.
  • No es seguro para los bytes (estás usando mb_substr() )

La buena noticia es que OpenSSL hará el relleno PKCS # 5 automáticamente, pero debe ir aún más lejos y usar una biblioteca de cifrado sólida como defuse/php-encryption .