xumarhu.net biblioteca
Principal > Biblioteca > Manuales de Comandos > Cifrado en MySQL
línea

Cifrado en MySQL


Funciones para cifrar contraseñas

Para cifrar contraseñas se utilizan las funciones PASSWORD, ENCRYPT, MD5, SHA(SHA1) y SHA2.

PASSWORD

La función PASSWORD sirve para cifrar las contraseñas de los usuarios de MySQL, pero no se recomienda, es mejor usar MD5 ó SHA. Su sintaxis es:

PASSWORD ( cadena_a_cifrar )

La función PASSWORD es de una vía (no reversible). Un ejemplo de esta función corriendo en la terminal de MySQL se muestra a continuación:

mysql> SELECT PASSWORD ('hola');
+-------------------------------------------+
| PASSWORD ('hola') |
+-------------------------------------------+
| *3F50515DDEE62F18A2B1CE3BE819CFB2F3C869F1 |
+-------------------------------------------+
1 row in set (0.00 sec)

ENCRYPT

Esta función sirve para cifrar una cadena de caracteres (cadena) usando una llamada al sistema (UNIX) y retorna la cadena cifrada. El argumento opcional "salto" debe ser una cadena de al menos 2 caracteres de longitud, si no se especifica, será utilizado un salto aleatorio.

ENCRYPT ( cadena [, salto] )

Un ejemplo para cifrar la cadena 'hola' (cada vez que se corre este ejemplo lo cifra de manera diferente por el salto aleatorio):

mysql> SELECT ENCRYPT ('hola');
+------------------+
| ENCRYPT ('hola') |
+------------------+
| sPUQTq14HUvPQ |
+------------------+
1 row in set (0.00 sec)

Un ejemplo para cifrar la cadena 'hola' utilizando la cadena 'alguna_cadena' como salto para realizar el cifrado (cada vez que se corre este ejemplo lo cifra de manera igual si se utiliza la misma cadena para el salto):

mysql> SELECT ENCRYPT ('hola', 'alguna_cadena');
+-----------------------------------+
| ENCRYPT ('hola', 'alguna_cadena') |
+-----------------------------------+
| alpDIEWa4HrxA |
+-----------------------------------+
1 row in set (0.00 sec)

MD5

Esta función sirve para cifrar una cadena utilizando el algoritmo MD5 (message Digest Algorith) generando una salida de 128 bits. Su sintaxis es la siguiente:

MD5 (cadena)

Un ejemplo para cifrar la cadena 'hola' utilizando MD5:

mysql> SELECT MD5 ('hola');
+----------------------------------+
| MD5 ('hola') |
+----------------------------------+
| 4d186321c1a7f0f354b297e8914ab240 |
+----------------------------------+
1 row in set (0.00 sec)

SHA (SHA1)

Esta función sirve para cifrar una cadena utilizando el algoritmo SHA (Secure Hash Algorithm), generando una salida de 160 bits. Su sintaxis es la siguiente:

SHA (cadena)

Se puede utilizar SHA ó SHA1 de manera indistinta, su sintaxis y funcionamiento son iguales. Un ejemplo para cifrar la cadena 'hola' utilizando SHA:

mysql> SELECT SHA ('hola');
+------------------------------------------+
| SHA ('hola') |
+------------------------------------------+
| 99800b85d3383e3a2fb45eb7d0066a4879a9dad0 |
+------------------------------------------+
1 row in set (0.00 sec)

SHA2

La documentación de MySQL indica que respecto a los exploits (códigos o programas que explotan una vulnerabilidad o problema de seguridad) publicados respecto de los algoritmos MD5 y SHA1, se recomienda utilizar SHA-2, la cual se encuentra disponible a partir de la versión 6 de MySQL. Su sintaxis es la siguiente: SHA2 ( cadena, longitud )

La longitud es la cantidad de bits de salida del algoritmo, la cual puede ser 224, 256, 384 y 512).



Funciones para cifrado simétrico de datos

MySQL provee, para el cifrado y descifrado simétrico, las implementaciones de 2 algoritmos: TripleDES y AES. Estas implementaciones constan de un par de funciones (una para cifrar y otra para descifrar) para cada uno de los 2 algoritmos.

TripleDES

Esta función sirve para cifrar una cadena utilizando un número ó cadena de caracteres como llave. Esta función se ejecutará sólo si MySQL fué configurado con soporte para SSL. Su sintaxis es la siguiente:

DES_ENCRYPT ( cadena [ , { llave_numero | llave_cadena } ]

La contraseña o llava para cifrar se determina según el segundo argumento. Si no se ha especificado alguno, se usará la primera contraseña del archivo de contraseñas DES. A continuación un ejemplo para cifrar la cadena 'hola' utilizando TripleDES sin utilizar llave:

mysql> SELECT DES_ENCRYPT ('hola');
+----------------------+
| DES_ENCRYPT ('hola') |
+----------------------+
| zxcvbn |
+----------------------+
1 row in set (0.00 sec)

Nota: la cadena cifrada 'zxcvb' no corresponde al real que genera TripleDES.

Si la llave es un número se utilizará un rango entre 0 y 9. A continuación un ejemplo para cifrar la cadena 'hola' utilizando TripleDES con una llave numérica 5:

mysql> SELECT DES_ENCRYPT ('hola',5);
+------------------------+
| DES_ENCRYPT ('hola',5) |
+------------------------+
| qwerty |
+------------------------+
1 row in set (0.00 sec)

Nota: la cadena cifrada 'qwerty' no corresponde al real que genera TripleDES.

A continuación un ejemplo para cifrar la cadena 'hola' utilizando TripleDES con una llave alfanumérica ('llave_alfanumerica'):

mysql> SELECT DES_ENCRYPT ('hola','llave_alfanumerica');
+-------------------------------------------+
| DES_ENCRYPT ('hola','llave_alfanumerica') |
+-------------------------------------------+
| asdfgh |
+-------------------------------------------+
1 row in set (0.00 sec)

Nota: la cadena cifrada 'asdfgh' no corresponde al real que genera TripleDES.

Ya que tenemos los datos cifrados se requiere el proceso inverso, es decir, descifrar lo que se almacenó para utilizar la información, para ello se utiliza la función:

DES_ENCRYPT

A continuación se muestra un ejemplo que corre en la consola de MySQL donde se crea una base de datos (base_cifrada), se crea una tabla (agenda) que contiene 2 campos (nombre y edad) y se inserta un registro, donde el nombre ('adriana') se cifra con TripleDES:

CREATE DATABASE base_cifrada;
USE base_cifrada;
CREATE TABLE agenda (nombre text, edad int);
INSERT INTO agenda values(DES_ENCRYPT ('adriana'), 15);

y continuación una consulta para buscar el nombre cifrado y desplegar su edad:

SELECT * FROM agenda WHERE DES_DECRYPT(nombre)='adriana';

AES

El AES (Advanced Encryption Standard) conocido anteriormente como Rijndael, es un algoritmo de cifrado que por defecto utiliza una llave de 128 bits de longitud, pero es posible ampliarlo hasta 256 bits modificando el código fuente. En la documentación oficial de este algoritmo aclara que se ha seleccionado una longitud de 128 bits por cuestiones de velocidad y considera que, de momento, sería suficientemente seguro.

Para Cifrar: AES_ENCRYPT ( cadena, llave )

Ejemplo:
CREATE DATABASE base_cifrada;
USE base_cifrada;
CREATE TABLE agenda (nombre text, edad int);
INSERT INTO agenda values(AES_ENCRYPT('hola','mi_llave'), 15);

Para Descifrar: AES_DECRYPT ( cadena, llave )

Ejemplo:
SELECT * FROM agenda WHERE AES_DECRYPT(nombre, 'mi_llave')='hola';

Si se desea extraer todos los campos cifrados:

select AES_DECRYPT(nombre, 'mi_llave'), AES_DECRYPT(edad, 'mi_llave') from agenda";

línea
Usted se encuentra Aquí > Principal > Biblioteca > Manuales de Comandos > Cifrado en MySQL
Portal de Tecnología desarrollado por: Rogelio Ferreira Escutia
Valid CSS Valid XHTML 5