Le moyen le plus simple de sécuriser votre schéma de stockage de mots de passe consiste à utiliser une bibliothèque standard .
Parce que la sécurité a tendance à être beaucoup plus compliquée et avec plus de possibilités de vissage invisibles que la plupart des programmeurs ne pourraient résoudre seuls, l'utilisation d'une bibliothèque standard est presque toujours l'option disponible la plus simple et la plus sûre (sinon la seule).
La nouvelle API de mot de passe PHP (5.5.0+)
Si vous utilisez PHP version 5.5.0 ou plus récente, vous pouvez utiliser la nouvelle API de hachage de mot de passe simplifiée
Exemple de code utilisant l'API de mot de passe de PHP:
<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);
// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
(Si vous utilisez toujours l'ancienne version 5.3.7 ou plus récente, vous pouvez installer ircmaxell / password_compat pour avoir accès aux fonctions intégrées)
Amélioration des hashes salés: ajoutez du poivre
Si vous voulez une sécurité supplémentaire, les responsables de la sécurité recommandent maintenant (2017) d'ajouter un `` poivre '' aux hachages de mot de passe (automatiquement) salés.
Il existe une classe simple qui implémente en toute sécurité ce modèle, je recommande:
Netsilik / PepperedPasswords
( github ).
Il est livré avec une licence MIT, vous pouvez donc l'utiliser comme vous le souhaitez, même dans des projets propriétaires.
Exemple de code utilisant Netsilik/PepperedPasswords
:
<?php
use Netsilik/Lib/PepperedPasswords;
// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');
$hasher = new PepperedPasswords($config['pepper']);
// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);
// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
La bibliothèque standard ANCIENNE
Remarque: vous ne devriez plus en avoir besoin! Ce n'est ici qu'à des fins historiques.
Jetez un oeil à: Framework de hachage de mot de passe PHP portable : phpass et assurez-vous d'utiliser l' CRYPT_BLOWFISH
algorithme si possible.
Exemple de code utilisant phpass (v0.2):
<?php
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
PHPass a été implémenté dans certains projets assez connus:
- phpBB3
- WordPress 2.5+ ainsi que bbPress
- la version Drupal 7, (module disponible pour Drupal 5 & 6)
- autres
La bonne chose est que vous n'avez pas à vous soucier des détails, ces détails ont été programmés par des personnes expérimentées et examinés par de nombreuses personnes sur Internet.
Pour plus d'informations sur les schémas de stockage des mots de passe, lisez l' article de blog de Jeff : Vous stockez probablement les mots de passe de manière incorrecte
Quoi que vous fassiez si vous optez pour l' approche « je le ferai moi-même, merci », ne l'utilisez plus MD5
ou SHA1
plus . Ce sont de bons algorithmes de hachage, mais considérés comme défectueux pour des raisons de sécurité .
Actuellement, l'utilisation de crypt , avec CRYPT_BLOWFISH est la meilleure pratique.
CRYPT_BLOWFISH en PHP est une implémentation du hachage Bcrypt. Bcrypt est basé sur le chiffrement par bloc Blowfish, utilisant sa configuration de clé coûteuse pour ralentir l'algorithme.