Encryption Functions (Funciones de Cifrado)
Las funciones en esta sección cifran y descifran valores. Almacenar contraseñas en MySQL como texto plano (sin encriptar) nunca será una buena idea. Como buenos administradores de bases de datos debemos tener cuidado de proteger la información de nuestros usuarios. Afortunadamente MySQL provee diversas opciones para proteger contraseñas. Todas las funciones disponibles en MySQL la vamos a ver a continuación.
Las mas importantes son: PASSWORD, MD5, SHA y AES.
AES_DECRYPT y AES_ENCRYPT
Estas funciones permiten el cifrado y descifrado de datos usando el algoritmo oficial AES (Advanced Encryption Standard), conocido anteriormente como "Rijndael." Se usa un cifrado con una clave de 128-bit, pero puede ampliarlo hasta 256 bits modificando las fuentes. Elegimos 128 porque es mucho más rápido y de momento es suficientemente seguro.
Estas funciones pueden considerarse las funciones de cifrado criptograficamente mas seguras disponibles en MySQL.
Este tipo de encriptación se utiliza también para las contraseñas de los wifis con el tipo de contraseña WPA2
La sintaxis de AES_ENCRYPT es la siguiente:
mysql> AES_ENCRYPT(str,key_str);
mysql> AES_ENCRYPT(cadena para encriptar,clave de encriptación);
podria ser:
ENCRIPTAR 'ALTAIR876' CON EL TIPO DE CONTRASEÑA 'clave1';
mysql> SELECT AES_ENCRYPT('ALTAIR876','clave1');
+-----------------------------------+
| AES_ENCRYPT('ALTAIR876','clave1') |
+-----------------------------------+
| ↓├BdH☻>¾╬õ®d!\▬= |
+-----------------------------------+
1 ROW IN SET (0.00 sec)
Ejemplo App Web
Las instrucciones para una aplicación web que usara claves encriptadas serían como las siguientes:
(sea clavecomun la clave de encriptación, usada por la aplicación, como la clave wifi).
mysql> SELECT ID_USU WHERE user='nombreusu' AND password=AES_ENCRYPT('clavecomun','claveusu');
En este ejemplo, nombreusu y claveusu serían los valores que el usuario habría indicado en el formulario de login.
La query devolvería un registro si el usuario y la contraseña fuesen correctos. En caso contrario no devolvería nada.
Para insertar un usuario nuevo que se registrara en la aplicación sería algo como lo siguiente:
mysql> INSERT INTO usuarios (user, password) VALUES ('nombreusu', AES_ENCRYPT('clavecomun','claveusu'));
La sintaxis de AES_DECRYPT es la siguiente:
mysql> AES_DECRYPT(crypt_str,key_str);
mysql> AES_DECRYPT(cadena encriptada,tipo de encriptcion);
DESENCRIPTAR LA CONTRASEÑA DEL EMPLOYEE_ID=8 CON EL TIPO DE CONTRASEÑA 'clave1';
mysql> SELECT AES_DECRYPT(PASSWD,'clave1'), PASSWD FROM EMPLOYEES_FJB WHERE EMPLOYEE_ID=8;
+------------------------------+------------------+
| AES_DECRYPT(PASSWD,'clave1') | PASSWD |
+------------------------------+------------------+
| ALTAIR876 | ↓ÃBdH☻>óÎä©d!\▬= |
+------------------------------+------------------+
1 ROW IN SET (0.00 sec)
PASSWORD
Esta función está presente desde hace unas cuantas versiones (es la mas antigua) pero se ha demostrado que es fácilmente vulnerable.
La forma en la que MySQL sabe si el password introducido es el adecuado, es comparando la cadena resultante de la encriptación con la cadena encriptada, si esa comparación resulta cierta, entonces MySQL sabe que el password era el correcto. Por motivos de vulnerabilidad, esta en desuso.
mysql> SELECT password ("esto es una clave");
+--------------------------------------+
| password ("esto es una clave") |
+--------------------------------------+
| 426e25d073d592e5 |
+--------------------------------------+
1 ROW IN SET (0.00 sec)
OLD_PASSWORD
Se añadió en MySQL 4.1,cuando se cambió la implementación de PASSWORD() para mejorar la seguridad. OLD_PASSWORD() retorna el valor de la implementación pre-4.1 de PASSWORD(), y está hecha para permitirle resetear contraseñas para cualquier cliente pre-4.1 que necesite conectar a su versión 4.1 o posterior de MySQL server sin bloquearlo.
mysql> SELECT OLD_PASSWORD('contrasenya');
+-----------------------------+
| OLD_PASSWORD('contrasenya') |
+-----------------------------+
| 519f0af553cf9170 |
+-----------------------------+
MD5
Para guardar una contraseña encriptada con MD5 necesitaremos una tabla con un campo de 32 caracteres, aunque se ha demostrado que el algoritmo MD5 puede ser vulnerado, la práctica es tan compleja que no merece la pena el esfuerzo, el algoritmo MD5 no puede ser revertido, es decir, no se pueden recuperar contraseñas de este sistema.
mysql> SELECT MD5("otraprueba");
+----------------------------------+
| MD5("otraprueba") |
+----------------------------------+
| 431ed8d94fde324c8ba6b51bf2b323a7 |
+----------------------------------+
1 ROW IN SET (0.00 sec)
SHA
La función SHA, al igual que MD5 no puede ser revertido y este necesita un campo de 40 caracteres para su almacenamiento, es más seguro que MD5 ya que calcula el cheksum SHA de 160 bits de una cadena, mientras que MD5 la calcula de 128, o NULL si el argumento era NULL. Uno de los usos posibles para esta función es una clave hash. También puede usarlo como función criptográficamente segura para almacenar contraseñas.
mysql> SELECT SHA("contrasenya");
+------------------------------------------+
| SHA("contrasenya") |
+------------------------------------------+
| c9ddd8c976785de06c9aa7d72e52a0b6bd05d35e |
+------------------------------------------+
1 ROW IN SET (0.00 sec)