Con el fin de mejorar la seguridad de un sistema
en el cual se utilizan contraseñas, se debe implementar
un algoritmo de cifrado en conjunto a un valor SALT
generado de forma aleatoria.
Los valores Salt son números de dígitos aleatorios
que se le agregan al hash
ya sea al principio o al final.
Con lo que los hashes ya no son los normales
y por ende no figurarán en una tabla de hashes
haciendo más difícil el decodificarlos.
La SALT actúa como una seed que permitirá al algoritmo de cifrado
tener en cuenta esos valores para generar el hash resultante.
Esto garantiza que la contraseña será mucho más complicada de romper
para un atacante y por ende, más segura.
-
Vamos a emplear el algoritmo SHA256 y para su utilización se debe
hacer uso de la función de PHP crypt en función del SALT.
-
El SALT lo extraemos de manera aleatorio en un alfabeto de 22
caracteres dentro del arreglo “valores_salt”, para obtener un cifrado
de mayor calidad.
ejemplo.php
<?php
$password = 'clave123456';
$valores_salt = './1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$salt = sprintf('$5$rounds=5000$', 7);
for($i = 0; $i < 22; $i++) {
$salt .= $valores_salt[mt_rand(0, 63)];
}
echo "Contraseña: ".crypt($password, $salt);
?>
-
La contraseña cifrada la podemos almacenar en la base de datos, y al
momento que un usuario se autentique en la aplicación podemos
comprobar si la clave ingresada es válida con la siguiente instrucción:
ejemplo.php
<?php
$contrasenarecibida= 'clave123456';
$passwbd = '$5$rounds=5000$eJXEzCMbmiAjCjuz$yBaYLFSiSrtltKL1G.O65GEdaG.SszQb8vrlz246mV1';
if(crypt($contrasenarecibida, $passwbd) == $passwbd) {
echo 'Es igual, el usuario se ha autenticado.';
}
else {
echo "Lo siento, revisa tus credenciales de acceso.";
}
?>
Los valores generados aleatoriamente que componen la SALT
no deben reutilizarse, puesto que podrían facilitar
a un atacante la tarea romper la contraseña y obtener acceso al sistema.
Es importante tener en cuenta que en caso de que se requieran almacenar
los valores usados como SALT por cada contraseña,
se debe optar por hacerlo en una base de datos a parte,
de forma que si la base de datos principal se ve comprometida,
se pueda evitar accesos al sistema por parte autores maliciosos.