web-dev-qa-db-fra.com

Comment utiliser l'algorithme Argon2 avec password_hash?

J'ai donc entendu dire que PHP 7.2 a introduit le nouveau algorithme Argon2 . Mais je ne sais pas comment je peux l'utiliser avec mon code existant. Par exemple, j'ai ceci

$password = password_hash('somepassword', PASSWORD_DEFAULT, ['cost' => 12]);

Est-ce que PASSWORD_DEFAULT utilise maintenant Argon2? Que dois-je, le cas échéant, changer avec password_verify? Bcrypt est-il considéré comme non sécurisé maintenant?

20
Machavity

Qu'est-ce que Argon2? Est-ce que bcrypt est mauvais maintenant?

Avant PHP 7.2, le seul algorithme de hachage password_hash utilisé était bcrypt. Au moment d'écrire ces lignes, bcrypt est toujours considéré comme un hachage fort, surtout par rapport à ses prédécesseurs, md5 et sha1 (qui sont tous les deux non sécurisés car rapides ). Argon2 est simplement un algorithme plus coûteux pour la force brute

Argon2i utilise un accès mémoire indépendant des données. Il est plus lent car il fait plus de passages sur la mémoire pour se protéger contre les attaques de compromis. Il est fortement recommandé pour le hachage de mot de passe et la dérivation de clé basée sur un mot de passe.

Bcrypt est toujours un hachage acceptable pour les mots de passe. Il n'est pas nécessaire de changer si vous ne le souhaitez pas (à partir de la version 7.2.0). Également, PASSWORD_DEFAULT ne devrait changer (par politique PHP PHP ) que sur la prochaine version complète (7.3.0 ou supérieure). Si vous voulez vous assurer de ne continuer qu'avec bcrypt, vous pouvez utiliser PASSWORD_BCRYPT au lieu. Cela n'est cependant pas nécessaire, comme nous le verrons ci-dessous.

Comment utilisez-vous Argon2?

Commençons par changer le deuxième argument de password_hash passer à l'une de ces constantes

  • PASSWORD_ARGON2I - PHP 7.2.0+
  • PASSWORD_ARGON2ID - PHP 7.3.0+ (préféré si disponible, voir les notes ci-dessous)

puis nous devrons changer nos options. bcrypt utilise cost comme paramètre pour combien de fois il itère sur le mot de passe (coût plus élevé = temps de hachage plus long). Il existe cependant différents facteurs de coût

password_hash('somepassword', PASSWORD_ARGON2I, ['memory_cost' => 2048, 'time_cost' => 4, 'threads' => 3]);

D'après le manuel nous voyons ce que font ces options

  • memory_cost - Mémoire maximale (en octets) pouvant être utilisée pour calculer le hachage Argon2 (1024 par défaut)
  • time_cost - Durée maximale de calcul du hachage Argon2 (par défaut 2)
  • threads - Nombre de threads à utiliser pour calculer le hachage Argon2 (par défaut 2)

Comprenez, avant de les modifier, qu'un coût plus élevé ici ralentira votre script . Vous voudrez exécuter un test sur votre serveur pour trouver un paramètre qui vous convient le mieux. C'est généralement en bouclant sur plusieurs itérations d'un coût donné. Le le manuel PHP en donne un exemple si vous en avez besoin.

Notez également que, alors que bcrypt stocke 60 caractères, Argon2 peut nécessiter plus que cela. Idéalement, votre champ de mot de passe doit stocker 255 caractères.

Que changeons-nous dans password_verify?

La réponse ici est ... rien. Comprendre que password_verify est suffisamment intelligent pour déterminer quel algorithme a été utilisé et le gérer de manière appropriée. Comme mentionné ci-dessus, cela signifie que si vous utilisez PASSWORD_DEFAULT, la valeur par défaut peut changer et ne pas vous affecter négativement (même si vous devrez peut-être ajuster les paramètres de coût). password_verify nécessite simplement un algorithme qu'il prend en charge. Si vous passez de bcrypt à Argon2, les deux vérifieront de la même manière, car toutes les données nécessaires (sel, hachage et coût) sont stockées pour vous.

//Works for both bcrypt and Argon2
if(password_verify($user_password, $stored_hash)) {
    // password validated
}

Si vous souhaitez mettre à niveau les hachages à partir de bcrypt, vous pouvez le faire lorsqu'un utilisateur se connecte avec succès (et vous a donc fourni le mot de passe non haché). Vérifiez simplement si votre hachage commence par $2y$ (le marqueur bcrypt). Si tel est le cas, transmettez le mot de passe fourni à password_hash à nouveau, mais avec les arguments Argon2, et enregistrez-le dans le champ de mot de passe de l'utilisateur connecté.

Qu'est-ce que Argon2ID?

Introduit dans PHP 7. , Argon2ID apporte quelques améliorations par rapport à Argon2I comme indiqué dans ce question Crypto.SE

La meilleure attaque de compromis sur Argon2id 1 passe est l'attaque combinée de faible stockage (pour la première moitié de la mémoire) et l'attaque de classement (pour la seconde moitié), qui réunissent le facteur d'environ 2,1.

Argon2ID fonctionne avec les mêmes arguments qu'avec Argon2I.

39
Machavity