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 .