PHP Créer un hachage de mot de passe


Exemple

Créez des hachages de mots de passe en utilisant password_hash() pour utiliser le hachage standard ou la dérivation de clés des meilleures pratiques du secteur. Au moment de l'écriture, la norme est bcrypt , ce qui signifie que PASSWORD_DEFAULT contient la même valeur que PASSWORD_BCRYPT .

$options = [
    'cost' => 12,
];

$hashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT, $options);

Le troisième paramètre n'est pas obligatoire .

La valeur 'cost' doit être choisie en fonction du matériel de votre serveur de production. L'augmenter rendra le mot de passe plus coûteux à générer. Plus il est coûteux de générer plus il faudra de temps pour que quelqu'un essaie de le générer pour le générer. Le coût devrait idéalement être aussi élevé que possible, mais en pratique, il devrait être réglé de manière à ne pas trop ralentir le processus. Quelque part entre 0,1 et 0,4 seconde serait bien. Utilisez la valeur par défaut si vous avez un doute.

5.5

Sur PHP inférieur à 5.5.0, les fonctions password_* ne sont pas disponibles. Vous devez utiliser le pack de compatibilité pour remplacer ces fonctions. Notez que le pack de compatibilité requiert PHP 5.3.7 ou supérieur ou une version $2y correctif $2y (comme RedHat le fournit).

Si vous ne pouvez pas les utiliser, vous pouvez implémenter un hachage de mot de passe avec crypt() Comme password_hash() est implémenté comme un wrapper autour de la fonction crypt() , vous n'avez besoin de perdre aucune fonctionnalité.

// this is a simple implementation of a bcrypt hash otherwise compatible
// with `password_hash()`
// not guaranteed to maintain the same cryptographic strength of the full `password_hash()`
// implementation

// if `CRYPT_BLOWFISH` is 1, that means bcrypt (which uses blowfish) is available
// on your system
if (CRYPT_BLOWFISH == 1) {
    $salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
    $salt = base64_encode($salt);
    // crypt uses a modified base64 variant
    $source = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    $dest = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt = strtr(rtrim($salt, '='), $source, $dest);
    $salt = substr($salt, 0, 22);
    // `crypt()` determines which hashing algorithm to use by the form of the salt string
    // that is passed in
    $hashedPassword = crypt($plaintextPassword, '$2y$10$'.$salt.'$');
}

Salt pour mot de passe hash

Malgré la fiabilité de l'algorithme de cryptage, il existe toujours une vulnérabilité contre les tables arc-en-ciel . C'est la raison pour laquelle il est recommandé d'utiliser du sel .

Un sel est quelque chose qui est ajouté au mot de passe avant le hachage pour rendre la chaîne source unique. Compte tenu de deux mots de passe identiques, les hachages résultants seront également uniques, car leurs sels sont uniques.

Un sel aléatoire est l'un des éléments les plus importants de la sécurité de votre mot de passe. Cela signifie que même avec une table de recherche de hachages de mots de passe connus, un attaquant ne peut pas faire correspondre le hachage du mot de passe de votre utilisateur avec le hachage du mot de passe de la base de données. Vous devez toujours utiliser des sels aléatoires et cryptographiquement sécurisés. Lire la suite

Avec l'algorithme bcrypt password_hash() , le sel en texte brut est stocké avec le hachage résultant, ce qui signifie que le hachage peut être transféré sur différents systèmes et plates-formes et être toujours comparé au mot de passe d'origine.

7.0

Même si cela est déconseillé, vous pouvez utiliser l'option salt pour définir votre propre sel aléatoire.

 $options = [
        'salt' => $salt, //see example below
 ];

Important Si vous omettez cette option, un sel aléatoire sera généré par password_hash () pour chaque mot de passe haché. C'est le mode de fonctionnement prévu.

7.0

L'option salt a été déconseillée à partir de PHP 7.0.0. Il est maintenant préférable d'utiliser simplement le sel généré par défaut.