Les classiques


Chiffrement des mots de passe

Il faut oublier MD5 et autres SHA1, et passer à du lourd comme l'algorithme Blowfish :

// Pour créer le condensat d'un mot de passe (72 caractères max) :
$hash = password_hash('mot de passe', PASSWORD_BCRYPT);

// Et pour vérifier la validité d'un mot de passe :
if ( password_verify($_POST['mot_de_passe'], $hash) ) {
	// Mot de passe correct !
}

Pour aller encore plus loin, voyez comment ils font chez Dropbox.

Ancienne méthode manuelle déconseillée :

// Pour créer le condensat d'un mot de passe :
$sel = base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()));
$sel = str_replace('+', '.', $sel);
$sel = substr($sel, 0, 22);
$hash = crypt('mot de passe', '$2x$11$'.$sel);

// Et pour vérifier la validité d'un mot de passe :
if ( crypt($_POST['mot_de_passe'], $hash) === $hash ) {
    // Mot de passe correct !
}

Le sel passé à la fonction crypt est formé tel que ${algorithme}${itérations}${sel} où :

  • ${algorithme} vaut $2x$ ou $2y$, si disponible (éviter d'utiliser $2a$)
  • ${itérations} : compris entre 04 et 31, il s'agit du nombre d'itérations (compléxité), plus il est proche de 31, mieux c'est, mais « de beaucoup de patience, t'armer il faudra -- maître Yoda »
  • ${sel} : chaîne de 22 caractères compris dans l'alphabet [./0-9A-Za-z]

Historique

  • 2016-09-29 : ajout du lien vers la méthode utilisée chez Dropbox pour chiffrer les mots de passe.
  • 2016-01-16 : correction de la fonction de vérification à l'aide de password_verify.
  • 2015-05-31 : utiisation des fonctions natives password_hash et hash_equals.