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 entre04
et31
, 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 de22
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.