Adición de sal en el registro
Entonces, ya sabes que el hash mediante
md5 es un proceso irreversible y un hacker,
que obtenga acceso al hash, no podrá obtener
la contraseña a partir de ese hash.
En realidad, esta afirmación no es del todo cierta - actualmente, hackers malintencionados han compilado bibliotecas de hashes de contraseñas populares y no tanto, y cualquier tonto puede descifrar una contraseña, simplemente buscando su hash en Google.
Se trata de contraseñas bastante simples y populares.
Busca en Google, por ejemplo, el hash 827ccb0eea8a706c4c34a16891f84e7b
e inmediatamente en los resultados de búsqueda verás que es
la contraseña '12345'.
Los hashes de contraseñas suficientemente complejas no se pueden descifrar de esta manera (pruébalo).
Podrías preguntar, cuál es el problema entonces - que todos nos registremos con contraseñas complejas. Sin embargo, hay un problema: la mayoría de los usuarios no piensa en la seguridad de sus datos y puede introducir contraseñas bastante simples.
Podemos obligar a pensar en
contraseñas más largas durante el registro, limitando, por ejemplo,
la cantidad mínima de caracteres a 6
o 8, sin embargo, igual aparecerán
contraseñas como '123456' o '12345678'.
Por supuesto, se puede idear un algoritmo más inteligente para verificar la complejidad de la contraseña, pero hay otra solución.
La esencia de esta solución es la siguiente: las contraseñas deben salarse. La sal es una cadena aleatoria especial, que se agregará a la contraseña durante el registro y el hash se calculará no a partir de una contraseña simple, sino a partir de la cadena sal+contraseña, es decir, a partir de la contraseña salada.
Es decir, durante el registro harás algo como esto:
<?php
$salt = '1sJg3hfdf'; // sal - cadena aleatoria compleja
$password = md5($salt . $_POST['password']); // convertimos la contraseña en un hash salado
?>
Además, la sal será diferente para cada usuario, necesitará generarse de forma aleatoria en el momento del registro.
Aquí hay una función lista que hará esto:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // longitud de la sal
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // símbolo de la tabla ASCII
}
return $salt;
}
?>
Con esta función podemos reescribir nuestro código así:
<?php
$salt = generateSalt(); // sal
$password = md5($salt . $_POST['password']); // contraseña salada
?>
Repito nuevamente, estos fueron cambios durante el registro - en la base de datos guardamos no simplemente el hash de la contraseña, sino el hash de la contraseña salada.
Esto no es todo: en la tabla de usuarios, además
del campo login y password, se necesita
crear también un campo salt, en el cual
almacenaremos la sal de cada usuario.
Implemente el registro descrito anteriormente con contraseña salada.