Como almacenar contraseñas en Mysql

Hay fallos de programación que a día de hoy siguen siendo más frecuentes de lo que deberían, los desarrollador deberían saber que crear una tabla con contraseñas totalmente accesibles es un fallo grave de seguridad. Uno de los puntos críticos que se debe proteger es el acceso a los datos de ususarios almacenados en la base de datos para que de ninguna de las formas un atacante pueda listar o modificar ningún dato de acceso.

La filtración de información sensible es un gran problema que puede acabar en sanciones para la empresa encargada de la seguridad de dichos datos aunque depende de la legislación de cada país y de los motivos de la filtración pueden o no aplicarse. MySQL ofrece diferentes soluciones para que las contraseñas sean más seguras, a continuación describo algunas empezando por la menos segura hasta la más segura:

Las más inseguras

Password (insegura)

Esta función es la más vulnerable y de desaconseja encarecidamente su uso.

MD5 (insegura)

En la actualidad, es bastante preocupante que todavía haya infinidad de aplicaciones que utilizan este algoritmo ya que puede romperse fácilmente. Se necesita un campo de 32 caracteres para almacenar la clave. Dado lo vulnerable de estas claves, es posible desencriptar cualquier clave md5 en cientos de páginas gratuitas.

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

SHA o SHA1 (inseguras)

La función SHA o 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 clientes VALUES('usuario',SHA('contraseña'));

Las más Seguras

Cifrado RSA (Segura)

RSA es uno de los sistemas de cifrado asimétricos más exitosos de la actualidad. Originalmente fué descubierto en 1973 por la agencia de inteligencia británica GCHQ, recibió la clasificación «top secret». Debemos agradecer a los criptólogos Rivest, Shamir y Adleman por su redescubrimiento civil en 1977. Ellos tropezaron con él durante un intento de resolver otro problema criptográfico.

A diferencia de los sistemas tradicionales de cifrado simétrico, RSA trabaja con dos claves diferentes: una pública y una privada. Ambos trabajan complementarios entre sí, lo que significa que un mensaje cifrado con uno de ellos sólo puede ser descifrado por su contraparte. Dado que la clave privada no puede calcularse a partir de la clave pública, ésta está generalmente disponible para el público.

Estas propiedades permiten que los criptosistemas asimétricos se utilicen en una amplia gama de funciones, como las firmas digitales. En el proceso de firma de un documento, una huella digital cifrada con RSA, se adjunta al archivo, y permite al receptor para verificar tanto el remitente como la integridad del documento. La seguridad de RSA se basa principalmente en el problema matemático de la factorización entera. Un mensaje que está a punto de ser cifrado se trata como un gran número. Al cifrar el mensaje, se eleva a la fuerza de la llave, y se divide con el resto por un producto fijo de dos primos. Repitiendo el proceso con la otra clave, el texto sin formato se puede recuperar de nuevo. El mejor método actualmente conocido para romper el cifrado requiere factorizar el producto utilizado en la división. Actualmente, no es posible calcular estos factores para números mayores de 768 bits. Es por eso que los criptosistemas modernos usan una longitud de clave mínima de 3072 bits.

RSA es mucho más lento que otros criptosistemas simétricos.

AES (segura)

Advanced Encryption Standard. Advanced Encryption Standard (AES), también conocido como Rijndael (pronunciado «Rain Doll» en inglés), es un esquema de cifrado por bloques adoptado como un estándar de cifrado por el gobierno de los Estados Unidos, creado en Bélgica.

El algoritmo AES es el más utilizado, la encriptación y desencriptación se basa en una llave privada que debemos proporcionar a partir de la cual se realizar el proceso de encriptado y desencriptado de las contraseñas. Si la llave está almacenada como parte de nuestro código fuente y alguien lograse vulnerar la seguridad del servidor, obtendría la llave con la que desencriptar las contraseñas almacenados en la base de datos. Las constraseñas se almacenan en un campo tipo BLOB, ya que el dato resultante será binario y aleatorio.

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

La función AES está disponible en MySQL a partir de la versión 4.0.2.

En resumen, la manera más utilizada y actual para el almacenamiento de contraseñas de manera segura, es utilizando la función AES. Aunque la seguirdad al 100% de cualquier sistema informático por el momento no existe.

Deja una respuesta