[PHP] Por que no utilizar unicamente md5() para contraseñas

Estado
No está abierto para más respuestas.

Bleed

Diamante
Usuario de Bronce
Mensajes
2,408
Puntuación de reacción
1
¿Por que md5(), la funcion mas comun para este fin, no es recomendada para contraseñas?

Si bien es cierto que la funcion md5() devuelve un hash hexadecimal de 32 caracteres unico para cada cadena de texto, y que este hash es irreversible y no se puede realizar la operacion inversa de convertir un hash MD5 a texto, con los medios tecnologicos actuales es verdaderamente facil obtener los datos de entrada originales (el texto sin md5()) por medio de la fuerza bruta.

Guardar la contraseña en la base de datos como texto plano es algo que a nadie se le ocurre, pero aun hoy en dia son cientos los CMS, algunos muy populares y conocidos, que siguen almacenando las contraseñas como un hash de md5() sin mas, lo cual pone en "peligro" la seguridad de esa contraseña, ya que se podria obtener facilmente el texto original.

Por ejemplo, imaginemos que mi contraseña es "tutorial_php_foro2.0", que en un principio parece una contraseña segura. Pues bien, el hash de esta contraseña, que es como muchas paginas almacenan este dato en su BD, tras pasar por md5(), seria :
d56d7302522298996d1976fdef8de7bf

Como digo, no es posible realizar la operacion inversa, y pasar de "d56d7302522298996d1976fdef8de7bf" a la contraseña original, como si ocurre con base64_encode(); y base64_decode();
Lo que si es posible es comparar el hash MD5 con una base de datos, como podria ser la de MD5Online.net. El resultado seria este :
N4hZf8p.png


Y ahi está nuestra contraseña, lo cual seria un autentico peligro si los datos de una BD cayeran en manos mal intencionadas.

Y lo mismo ocurriria con otras contraseñas almacenadas como un hash de MD5, en apariencia un metodo seguro :
8nu7G2m.png

PVlYqrY.png


¿Que hacer al respecto?

1- Utilizar un salt

Un salt criptografico es un dato que se añade durante el proceso de hash de la contraseña, para evitar que su resultado coincida al buscarlo en una tabla de pares precalculados (como la que cito arriba). Un ejemplo :
PHP:
<?php
$pass = "tutorial_php_foro2.0";
$salt = "@$%&//())=?¿?)=!paramasseguridadañadounsalt";
echo md5($salt.$pass);
?>

El resultado seria que el hash de nuestra contraseña con el salt añadido seria :
b559c9ac8267a565a31ce80ba6585fc7

Y tras intentar compararlos con los hash almacenados en la BD:
NiBPASo.png


Obviamente el salt ha de ser siempre exactamente el mismo, pues en cuanto una sola letra cambie, aunque tan solo sea de orden o de minusculas a mayusculas, el hash resultante no coincidirá con el que nosotros hayamos almacenado durante el registro del usuario, y por tanto, aunque el usuario escriba la contraseña correcta, estas no van a coincidir nunca.

2- El hash del hash

Otra opcion es hashear el hash varias veces. Por ejemplo :
PHP:
<?php
$pass = "tutorial_php_foro2.0";
$hash = md5(md5(base64_encode(md5($pass))));
echo $hash;
?>

Que daria de resultado :
287f2e9c098ee6682df40a62d03b48c9

Y tras intentar compararlo :
QbFPqsz.png



Como veis, aunque md5() es la funcion mas utilizada para almacenar contraseñas en una base de datos, emplear unicamente esta funcion sobre el texto que recibimos no es aconsejable. Aunque no se puede "desencriptar", se puede comparar con una base de pares (hash y original), lo cual pone en entre dicho la seguridad de nuestra paginas. Y como digo, es algo que aun hoy en dia mucha gente sigue realizando.

Asi que nada, ahi os dejo ese tochaco. Me habré dejado alguna cosa atras fijo, pero ante cualquier duda dejais un comentario. :mola:
 

Axl

Hierro
Mensajes
81
Puntuación de reacción
0
No se si me he enterado muy bien pero parece interesante, como lo puedo añadir a wordpress esto? y no me queda claro, como alguien puede sacar mi md5? Si es así de fácil enserio estamos en grave peligro ;/
 

Bleed

Diamante
Usuario de Bronce
Mensajes
2,408
Puntuación de reacción
1
Muy buen tutorial :D, perfecto.!

Gracias. ;)

No se si me he enterado muy bien pero parece interesante, como lo puedo añadir a wordpress esto? y no me queda claro, como alguien puede sacar mi md5? Si es así de fácil enserio estamos en grave peligro ;/

Esto es para que lo tenga en cuenta quien se dedique a hacer cosillas con PHP. Es un punto muy importante a tener en cuenta para aumentar la seguridad.

Obviamente no es tan fácil obtener la base de datos de una web ajena, pero tampoco imposible.

Y no se como aplicarlo a WordPress ni se si no lo hacen ellos ya por defecto. Si no habría que mirar todo el código bien y cambiar un puñado de cosas. Como te digo, lo he escrito para que quien se dedique a programar lo tenga en cuenta. Los códigos que he puesto no son más que ejemplos, no son scripts útiles que puedas copiar y pegar sin más.

Enviado desde mi LG-P700 usando Tapatalk 2
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
No se si me he enterado muy bien pero parece interesante, como lo puedo añadir a wordpress esto? y no me queda claro, como alguien puede sacar mi md5? Si es así de fácil enserio estamos en grave peligro ;/
Las de Wordpress son md5 pero creo que llevan un salt
 

Bleed

Diamante
Usuario de Bronce
Mensajes
2,408
Puntuación de reacción
1
yo suelo usar sha1 en vez de md5, es mucho mas difícil de decifrar

saludos

Da lo mismo utilizar sha1() que md5(), aunque ninguna de las dos se pueden descifrar, con fuerza bruta es muy facil comparar el hash con una base de datos de pares precalculados y obtener el string original. ;)
 
Mensajes
85
Puntuación de reacción
0
Da lo mismo utilizar sha1() que md5(), aunque ninguna de las dos se pueden descifrar, con fuerza bruta es muy facil comparar el hash con una base de datos de pares precalculados y obtener el string original. ;)

a eso me refiero, pero MD5 es mucho mas rapido de conocer (por no decir decifrar) la contraseña :)

saludos
 

rikiSEO

Piedra
Usuario de Piedra
Mensajes
59
Puntuación de reacción
0
Buen tutorial, todos deberíamos aplicar esta medida de seguridad en nuestras bases de datos.
 

Focux

Piedra
Usuario de Piedra
Mensajes
42
Puntuación de reacción
0
Yo siempre uso dos encriptaciones, md5 y sha1.
 
Estado
No está abierto para más respuestas.
Arriba