Fonction password_hash
En réalité, la fonction md5 et le salage
du mot de passe avec celle-ci sont considérés comme obsolètes.
Nous l'avons étudiée pour que vous compreniez la suite
du matériel, et aussi parce que vous pourriez y être confronté
en travaillant sur des projets externes.
Il existe une manière plus perfectionnée d'obtenir
un mot de passe salé. Pour cela, on utilise la fonction
password_hash. Son premier paramètre est
une chaîne de caractères, et le second - l'algorithme de chiffrement
(voir plus tard), et elle retourne le hachage de cette chaîne
avec le sel.
Essayez d'exécuter ce code plusieurs fois :
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Vous obtiendrez un résultat différent à chaque fois et dans ce résultat, la première partie de la chaîne sera le sel, et la seconde partie - le mot de passe salé.
Supposons que nous ayons un hachage obtenu de la fonction
password_hash et un certain mot de passe. Pour
vérifier s'il s'agit du hachage de ce mot de passe ou non,
il faut utiliser la fonction password_verify
- son premier paramètre est le mot de passe,
et le second - le hachage, et elle retourne true
ou false.
Regardons un exemple :
<?php
$password = '12345'; // mot de passe
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hachage
if (password_verify($password, $hash)) {
// le hachage provient de ce mot de passe
} else {
// le hachage ne provient pas de ce mot de passe
}
?>
Qu'est-ce que cela nous apporte en pratique : nous pouvons ne pas créer de champ séparé dans la base de données pour stocker le sel, ne pas nous embêter à générer ce sel - PHP fera tout pour nous !
Il en résultera que dans la base de données, dans le champ
password, nous stockerons le mot de passe salé
avec son sel. De plus, le mot de passe haché
aura une longueur plus importante. C'est pourquoi
dans la base de données, nous devons corriger la taille
du champ du mot de passe et la définir à 60
caractères.
Maintenant, corrigeons le code d'inscription. Voici ce que nous avons actuellement :
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // longueur du sel
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // caractère de la table ASCII
}
return $salt;
}
$salt = generateSalt(); // sel
$password = md5($salt . $_POST['password']); // transforme le mot de passe en hachage salé
?>
Avec password_hash, nous réduisons cela à :
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Le code d'authentification sera modifié de manière similaire :
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // obtient l'utilisateur par son login
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // mot de passe salé de la BDD
// Vérifie la correspondance entre le hachage de la base et le mot de passe saisi
if (password_verify($_POST['password'], $hash)) {
// tout est bon, on authentifie...
} else {
// le mot de passe ne correspond pas, on affiche un message
}
} else {
// l'utilisateur avec ce login n'existe pas, on affiche un message
}
?>
Modifiez votre authentification et votre inscription pour utiliser les nouvelles fonctions étudiées.