Adición de sal en la autorización
Ahora necesitamos cambiar la autorización. Aquí los cambios serán más sustanciales.
Ya no será posible verificar la corrección del par login-contraseña inmediatamente, con una sola consulta. ¿Por qué?: porque, para verificar la contraseña, es necesario obtener su hash con sal, y la sal se almacena en la base de datos y es única para cada login.
Tendremos que primero obtener el registro solo por el login, leer la sal, aplicar la sal a la contraseña introducida y compararla con la contraseña con sal de la base de datos, y solo si coinciden, autorizar al usuario.
Tenga en cuenta que puede darse el caso de que el login se haya introducido incorrectamente. En este caso, no es necesario realizar la verificación de la contraseña, y se puede mostrar inmediatamente que la autorización no es posible - los datos no son correctos:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'";
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
// existe un usuario con ese login, ahora hay que verificar la contraseña...
} else {
// no existe un usuario con ese login, mostraremos un mensaje
}
?>
Añadamos la verificación de la contraseña:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'";
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$salt = $user['salt']; // sal de la BD
$hash = $user['password']; // contraseña con sal de la BD
$password = md5($salt . $_POST['password']); // contraseña con sal del usuario
// Comparamos los hashes con sal
if ($password == $hash) {
// todo bien, autorizamos...
} else {
// la contraseña no coincide, mostraremos un mensaje
}
} else {
// no existe un usuario con ese login, mostraremos un mensaje
}
?>
Por seguridad, normalmente no se informa al usuario sobre qué exactamente no coincidió - el login o la contraseña, para dificultar la combinación de pares login-contraseña por parte de los hackers. Simplemente se muestra un mensaje indicando que el par login-contraseña es incorrecto o algo por el estilo.
Implemente la autorización descrita anteriormente con contraseña con sal. Intente registrarse, autorícese, compruebe que todo funciona.