Il y a beaucoup de questions sur le choix d'une fonction de hachage, y compris Comment hacher en toute sécurité les mots de passe? ou Existe-t-il des méthodes de hachage de mot de passe plus modernes que bcrypt et scrypt? , avec des réponses très détaillées, mais les uns doivent dater un peu .
Le consensus semblait être le suivant:
Argon2 est maintenant le vainqueur du concours de hachage de mot de passe, mais il est certainement encore assez nouveau, donc les mêmes arguments qui s'appliquaient à l'époque au cryptage s'appliquent probablement maintenant.
Des questions:
Fondamentalement, aujourd'hui, pour un système moyen avec des mots de passe, quelle fonction de hachage de mot de passe devrait-on préférer? Pour les fonctions qui ont des paramètres, quelles devraient-elles être?
Notez que même si la question est presque un double de Comment hacher en toute sécurité les mots de passe? , comme indiqué ci-dessus, la plupart des réponses à cette question remontent à 2010-2013, avec les dernières mises à jour pertinentes datant de 2016 . Les choses ont évidemment changé depuis lors, et ce que je recherche, c'est une mise à jour de ces excellentes réponses. N'hésitez pas à répondre avec une mise à jour dans cette question et fermez celle-ci si vous pensez que cela a plus de sens, mais s'il vous plaît ne fermez pas celle-ci sans une réponse à jour ici ou là.
Je ne recommande pas bcrypt pour les nouvelles conceptions où la valeur d'entrée est un jeton généré par l'homme (par exemple un mot de passe) et où le craquage hors ligne est dans le modèle de menace. Le manque de dureté de la mémoire est un grave problème si l'on considère la puissance du matériel de base de nos jours. Bien que l'absence de principales crypto-monnaies basées sur bcrypt n'ait pas attiré FPGA ou ASIC implémentations de minage pour l'algorithme, il y a toujours eu un certain intérêt à attaquer bcrypt en utilisant des SoC ARM/FPGA hybrides, comme dans cet article de 2014 . En fin de compte, le manque de dureté de la mémoire est un problème important pour les conceptions modernes.
scrypt a la dureté de la mémoire dans le cadre de sa conception, mais il présente quelques lacunes. Pour commencer, il existe un certain nombre de crypto-monnaies basées sur Scrypt, ce qui a attiré tout un marché pour les FPGA de base et ASIC solutions minières qui pourraient être réutilisées pour le craquage. En outre, la dureté de la mémoire de Scrypt et le nombre d'itérations est lié à un seul facteur de coût scalaire. Il est donc difficile d'adapter scrypt à votre propre modèle de menace. Je recommande scrypt où il s'agit de l'option la plus simple pour le stockage des mots de passe dans la langue ou le framework que vous utilisez, par exemple si c'est déjà une option intégrée pour protéger les mots de passe des utilisateurs.
En fin de compte, je recommande toujours Argon2 comme choix préféré, pour plusieurs raisons:
Comme vous l'avez noté, les paramètres que vous choisissez sont importants. scrypt ne vous donne pas beaucoup de choix, je recommande donc de choisir un facteur de coût basé sur le temps (par exemple 1500 ms de traitement) dans ce cas.
Pour Argon2, vous avez plus de choix que de simples paramètres. Il existe en fait trois implémentations différentes d'Argon2, appelées Argon2d, Argon2i et Argon2id. Le premier, Argon2d, est le plus cher en termes de calcul et résiste à l'accélération des GPU, FPGA et ASIC avec une bande passante mémoire limitée. Cependant, comme les accès à la mémoire d'Argon2d dépendent du mot de passe, les attaques par canal latéral qui fuient des informations sur les accès à la mémoire peuvent révéler le mot de passe. Argon2i, comme son suffixe l'indique, sélectionne les adresses mémoire indépendamment du mot de passe. Cela réduit sa résistance à la fissuration du GPU, mais élimine l'attaque latérale. Argon2id est une approche hybride dans laquelle la première passe utilise l'approche Argon2i (indépendante), et les passes suivantes utilisent l'approche Argon2d (dépendante).
Dans la mesure du possible, vous devez utiliser une implémentation Argon2id. Cependant, ce n'est pas toujours disponible. Pour un scénario dans lequel vous protégez des mots de passe sur un serveur et votre modèle de menace considère que les attaques par canal latéral d'accès à la mémoire sont très peu probables (c'est la plupart du temps selon mon expérience), vous pouvez utiliser Argon2d. Si les attaques par canal latéral d'accès à la mémoire sont considérées comme un risque potentiel, par exemple dans un système multi-locataire où des utilisateurs non fiables ou moins fiables exécutent du code sur le même système que le hachage Argon2, alors Argon2i peut être le meilleur choix.
En bref: utilisez Argon2id si vous le pouvez, utilisez Argon2d dans presque tous les autres cas, considérez Argon2i si vous avez vraiment besoin d'une résistance aux attaques des canaux latéraux de la mémoire.
Pour les paramètres, les seules règles strictes sont pour Argon2i, qui doit être traité spécialement en raison de sa faiblesse comparée aux autres options. Plus précisément, le nombre d'itérations doit être de 10 ou plus, en raison de ne attaque de compromis pratique sur Argon2i .
Vous devez modifier les paramètres selon vos propres cas d'utilisation et exigences de performances, mais je pense que les paramètres par défaut suivants sont acceptables pour Argon2id et Argon2d:
La vitesse dépend de votre processeur, mais j'ai atteint environ 2000 ms sur mon système.
Pour Argon2i, vous devez augmenter le nombre d'itérations à un minimum de 10, ce qui peut vous obliger à diminuer le facteur de mémoire pour des raisons de performances. C'est une autre raison d'essayer d'éviter Argon2i sauf si vous avez absolument besoin de sa résistance aux canaux latéraux d'accès à la mémoire.