Almacenar contraseñas en MySQL

 

Todo buen administrador sabe que crear una tabla con contraseñas totalmente accesibles es un fallo de seguridad tremendo. Imaginemos por un momento que pasaría si un hacker consiguiese llegar hasta nuestra tabla usuarios, sacar un listado de las contraseñas o peor aún, modificarlas.

Si este sistema guarda información sensible podría convertirse en un serio problema empresarial, por lo que la seguridad en cuanto a contraseñas siempre debe ser una premisa para nosotros. Por suerte, MySQL nos da diferentes herramientas para hacer nuestras contraseñas más seguras, vamos a enumerarlas desde la menos segura hasta la más segura de todas:

Password

Esta función está presente desde hace unas cuantas versiones, pero sin embargo se ha demostrado que es fácilmente vulnerable por lo que no merece la pena explicarla.

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.

Insertar una contraseña con MD5:
mysql> INSERT INTO usuarios VALUES('usuario',MD5('contraseña'));

 

SHA o SHA1

La función SHA y SHA1 son sinónimos, por lo que hacen el mismo efecto, 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.

Insertar una contraseña con SHA:
mysql> INSERT INTO usuarios VALUES('usuario',SHA('contraseña'));

AES

El algoritmo AES es el más completo y complejo, tiene posibilidad de revertirse y se utiliza con una llave privada, es decir, debemos proporcionar dicha llave para encriptar y desencriptar las contraseñas. Sería vulnerable en el caso de que alguien consiguiese violar nuestro código fuente y viera que llave estamos pasando a la cadena. Para almacenar estas contraseñas necesitamos que nuestro campo sea de tipo BLOB, ya que el resultado de la operación será un dato binario muy aleatorio.

Insertar una contraseña con AES:
mysql> INSERT INTO usuarios VALUES('usuario',AES_ENCRYPT('contraseña','llave'));
Para desencriptar:
mysql> INSERT INTO usuarios VALUES('usuario',AES_DECRYPT('contraseña','llave'));

Si quieres utilizar la función AES, debes de tener una versión de MySQL superior a la 4.0.2, ya que es cuando esta función fue agregada.

Por lo tanto ahora sabemos que la única manera (por ahora) de que nuestras contraseñas sean totalmente seguras, es utilizando la función AES, y asegurarse que nadie puede acceder a nuestro código fuente.