La función AES_ENCRYPT
de MySQL es insegura por defecto, ya que utiliza Modo ECB a menos que se configure de otro modo . La documentación proporciona un ejemplo de cómo usar el modo CBC con una clave de 256 bits (aunque su ejemplo de una clave es terrible):
mysql> SET block_encryption_mode = 'aes-256-cbc';
mysql> SET @key_str = SHA2('My secret passphrase',512);
mysql> SET @init_vector = RANDOM_BYTES(16);
mysql> SET @crypt_str = AES_ENCRYPT('text',@key_str,@init_vector);
mysql> SELECT AES_DECRYPT(@crypt_str,@key_str,@init_vector);
La longitud de la clave que desea utilizar depende de lo que block_encryption_mode
usted configura. Las longitudes de clave admitidas son 128, 192 y 256 (que también son las únicas longitudes de clave permitidas por AES).
Se puede ver aquí eso si la clave proporcionada es demasiado pequeña, se rellenará con un valor nulo (debido al memset
), y si es demasiado grande, xo los bytes adicionales con el primer key_size
bytes (por ejemplo, si el tamaño de la clave es de 4 bytes y la clave provista es 12345678, será xor 5678 con 1234 y usará el resultado como la clave). Para mayor seguridad, debe usar una clave aleatoria del tamaño que configure AES para usar. Para AES-128 desea una clave aleatoria de 128 bits, o 32 caracteres hexadecimales:
SELECT AES_ENCRYPT('text', UNHEX('6133C3D40B2BF9267E85ED0C2FDDC686'), @init_vector);
Para AES-256, desea una clave aleatoria de 256 bits, que es de 64 caracteres hexadecimales:
SELECT AES_ENCRYPT('text', UNHEX('08672D4D2424CFE10E5221BF2EB8409C57431B30B55D6AE2D167E5F9682EF711'), @init_vector);
La documentación de MySQL no tiene en cuenta que el IV (vector de inicialización) no debe ser reutilizado para múltiples encriptaciones, y por supuesto, el IV debe almacenarse para permitir el descifrado.
También se debe tener en cuenta que ninguno de los modos de cifrado que MySQL
los apoyos proporcionan autenticidad , y de los modos admitidos, ECB es terrible y CBC, CFB y OFB son todos malleable .