Bleed
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 :
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 :
¿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 :
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:
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 :
Que daria de resultado :
287f2e9c098ee6682df40a62d03b48c9
Y tras intentar compararlo :
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:
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 :
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 :
¿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:
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 :
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: