web-dev-qa-db-fra.com

Quels sont les paramètres minimaux pour argon2?

Argon2 est le gagnant de la compétition de hachage de mot de passe et est actuellement recommandé par Owasp pour un stockage sécurisé des mots de passe.

Une étape cruciale d'Argon2 est la détermination des paramètres utilisés par la fonction. Le projet actuel de l'IETF intitulé " la fonction de hachage de mot de passe d'argon2 de mémoire et de preuve de travail " a un chapitre nommé "choix de paramètres", qui fournit un guide étape par étape pour trouver le droit paramètres.

  1. Sélectionnez le type Y. Si vous ne connaissez pas la différence entre eux ou envisagez des attaques de canal latéraux comme une menace viable, choisissez Argon2ID.

    Cette étape semble assez simple. Le conseil d'utiliser argon2id comme défaut sauf si vous savez qu'un autre mode est meilleur pour votre cas d'utilisation.

  2. Déterminez le nombre maximum h des threads pouvant être initiés par chaque appel à Argon2.

    Cette étape est la première confusion. Comment "déterminer" combien de fils doivent être utilisés? Si un seul fil est utilisé, est-ce dangereux?

  3. Déterminez le montant maximum M de mémoire que chaque appel peut se permettre.

    Cette étape semble plus simple à nouveau. Toutefois, si un serveur a 128 gb RAM et attend environ 1024 connexions simultanées aux heures de pointe, ~ 128 Mo est le maximum. Cela ne répond pas cependant à ce qu'il y aurait 10 fois Beaucoup d'utilisateurs? Et si 1 Mo était le maximum? Et si 16 Ko était maximum? Quel point est "trop ​​peu" mémoire?

  4. Déterminez le montant maximum x du temps (en secondes) que chaque appel peut se permettre.

    Cela semble simple, des nombres plus élevés signifient plus de résistance au craquage au coût de la vitesse de connexion.

  5. Sélectionnez la longueur du sel. 128 bits suffisent pour toutes les applications, mais peuvent être réduits à 64 bits dans le cas des contraintes d'espace.

    Ceci est très utile car il fournit une valeur par défaut considérée comme sain d'esprit.

  6. Sélectionnez la longueur de la balise. 128 bits suffisent pour la plupart des applications, y compris une dérivation de clé. Si des clés plus longues sont nécessaires, sélectionnez Tags plus longs.

    Juste comme l'étape 5, cela est utile car il fournit une défaillance saine.

  7. Si des attaques de canal latéraux sont une menace viable, ou si vous êtes incertain, activez l'option d'essuyage de la mémoire dans l'appel de la bibliothèque.

    Des informations utiles, comme cela explique la menace, il essaie d'atténuer.

  8. Exécutez la schéma de type y, mémoire m et h voies et threads, utilisant un nombre différent de passes t. Déterminez le maximum T, de sorte que le temps d'exécution ne dépasse pas x. Si elle dépasse x Même pour T = 1, réduire M En conséquence.

    Cette étape est de loin le plus déroutant. L'idée est évidemment de comparer le système, de trouver des "bonnes" valeurs pour m, h et t, mais Il ne fournit aucune priorité à ces paramètres. Est-ce faible mémoire, mais le parallélisme élevé et de nombreuses itérations sont-elles bonnes? Qu'en est-il de la mémoire élevée et du parallélisme, mais peu d'itérations?


Résumer:

  • Quelles sont les valeurs minimales pour le parallélisme et l'utilisation de la mémoire pour être considérées comme "sécurisées"?
  • Quelle priorité utilise la mémoire, le parallélisme et les itérations?
  • Que se passe-t-il si un paramètre est trop bas, mais les deux autres relativement élevés, de manière à obtenir encore une vitesse d'exécution d'environ 1 seconde?
7
MechMK1

Le Spec Spec donne des informations très détaillées.

Comment "déterminer" combien de fils doivent être utilisés? Si un seul fil est utilisé, est-ce dangereux?

Le nombre maximum de threads que vous souhaitez est le nombre de threads matériels sur votre système. Un processeur Intel CPU de 4 noyau physiques Hyper-threading pour lui donner 8 noyaux logiques doit être exécuté argon2 avec 8 fils. Si vous n'utilisez qu'un seul thread, vous ne ferez pas une utilisation optimale de votre matériel. Ce n'est pas automatiquement dangereux, mais cela signifie que le KDF prendra plus de temps pour obtenir la même quantité de travail. Si vous avez un système avec un lot de threads matériels, vous voudrez peut-être simplement le comparer.

Cela ne répond pas cependant, et s'il y aurait 10 fois plus d'utilisateurs? Et si 1 Mo était le maximum? Et si 16 Ko était maximum? Quel point est "trop ​​peu" mémoire?

Il n'y a pas de limite inférieure efficace au-delà des limites imposées par la spécification. Vous pouvez l'apporter aussi bas que vous le souhaitez, mais rappelez-vous qu'une plus petite quantité de mémoire signifie qu'un attaquant sera en mesure d'utiliser plus facilement des processeurs spécialisés à grande vitesse tels que les Asics. Plus vous utilisez de mémoire que vous utilisez, plus il est cher est d'attaquer. Vous voulez utiliser le maximum possible. Si vous êtes obligé d'utiliser très peu de mémoire en raison de contraintes de ressources, vous ne pouvez rien faire à ce sujet.

Cette étape est de loin le plus déroutant. L'idée est évidemment de comparer le système, de trouver des "bonnes" valeurs pour m, h et t, mais cela ne fournit aucune priorité à ces paramètres. Est-ce faible mémoire, mais le parallélisme élevé et de nombreuses itérations sont-elles bonnes? Qu'en est-il de la mémoire élevée et du parallélisme, mais peu d'itérations?

Le parallélisme est en fait utilisé pour remplir la mémoire plus rapidement. Les threads plus matériels que vous utilisez, plus la mémoire peut être remplie et utilisée. En ce qui concerne l'utilisation de la mémoire et de l'itération, cela représente un compromis. Avec tous les algorithmes durs de la mémoire, un attaquant peut utiliser une Time-Memory Tradeoff (TMTO) Attaque où ils peuvent s'en tirer avec moins de mémoire que vous n'avez utilisé , mais au détriment des exigences de calcul considérablement augmentées. Plus vous utilisez d'itérations que vous utilisez, plus les calculs doivent être utilisés pour réduire la quantité de mémoire dont ils ont besoin d'utiliser. Le exacte Les valeurs optimales dépendent entièrement de l'économie de l'attaque elle-même (par exemple, il est possible d'atteindre 16 GiB de Mémoire ultra-haute vitesse et faible latence utilisant des TSV sur un substrat saphir, mais est-ce plus ou moins coûteux pour un attaquant donné que d'ajouter plus d'unités de calcul pour effectuer une attaque TMTO?).

Réponses connexes sur notre site sœur, cryptographie (et le tag argon2 ), qui aident à expliquer plus:

3
forest