Les classiques
- Cross-site request forgery ou CSRF => comprendre et s'en protéger
- Cross-site scripting ou XSS => comprendre et s'en protéger
- Injection SQL => comprendre et s'en protéger
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 entre04et31, 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 de22caractè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.