Функción password_hash
En realidad, la función md5 y la salazón
de contraseñas con ella se considera obsoleta.
La estudiamos para que entendierais el material
posterior, y también porque podéis encontrarla
trabajando en proyectos ajenos.
Existe una forma más avanzada de obtener
una contraseña salada. Para ello se usa la función
password_hash. Su primer parámetro es
una cadena, y el segundo - el algoritmo de cifrado
(sobre esto más tarde), y devuelve el hash de esta cadena
junto con la sal.
Intenta ejecutar este código varias veces:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Cada vez obtendrás un resultado diferente y en este resultado la primera parte de la cadena será la sal, y la segunda parte - la contraseña salada.
Supongamos que tenemos un hash, obtenido de la función
password_hash y alguna contraseña. Para
comprobar si es el hash de esta contraseña o no,
se debe usar la función password_verify
- su primer parámetro es la contraseña,
y el segundo - el hash, y devuelve true
o false.
Veamos un ejemplo:
<?php
$password = '12345'; // contraseña
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// el hash es de esta contraseña
} else {
// el hash no es de esta contraseña
}
?>
¿Qué nos aporta esto en la práctica: podemos evitar crear un campo separado en la base de datos para almacenar la sal, no preocuparnos por generar esta sal - ¡PHP lo hará todo por nosotros!
Es decir, en la base de datos, en el campo
password almacenaremos la contraseña salada
junto con su sal. Además, la contraseña con hash tendrá una longitud mayor. Por lo tanto,
en la base de datos necesitamos corregir el tamaño
del campo de la contraseña y establecerlo en 60
caracteres.
Ahora corrijamos el código de registro. Esto es lo que hay actualmente:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // longitud de la sal
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // carácter de la tabla ASCII
}
return $salt;
}
$salt = generateSalt(); // sal
$password = md5($salt . $_POST['password']); // convertimos la contraseña en hash salado
?>
Con password_hash podemos reducirlo a:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
De manera similar se modifica el código de autorización:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // obtenemos el usuario por login
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // contraseña salada de la BD
// Verificamos la correspondencia del hash de la base de datos con la contraseña ingresada
if (password_verify($_POST['password'], $hash)) {
// todo bien, autorizamos...
} else {
// la contraseña no coincide, mostramos mensaje
}
} else {
// no hay usuario con ese login, mostramos mensaje
}
?>
Modifica tu autorización y registro utilizando las nuevas funciones aprendidas.