web-dev-qa-db-fra.com

En 2018, quel est le hachage recommandé pour stocker les mots de passe: bcrypt, scrypt, Argon2?

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:

  • bcrypt est un bon choix
  • scrypt devrait être un meilleur choix, mais, à l'époque, c'était encore un peu nouveau, donc il faut attendre pour voir s'il résiste à l'épreuve du temps

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:

  • Bcrypt est-il toujours un bon choix?
  • Scrypt est-il maintenant un bon choix?
  • Argon2 est-il déjà un bon choix?

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?

Éditer

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à.

60
jcaron

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:

  1. Il existe depuis un certain temps maintenant - il a remporté le PHC en 2015. Il y a eu pas mal d'articles qui étudient les preuves de sécurité d'Argon2, et beaucoup d'autres qui étudient le potentiel façons d'accélérer l'algorithme sur du matériel dédié. Jusqu'à présent, il a très bien résisté à l'examen.
  2. Il existe implémentations et liaisons open source pour C, Erlang, Go, Haskell, JavaScript, Java, Lua, OCaml, Python, R, Ruby, Rust, C # (Framework et Core), Perl et Rapide.
  3. Argon2 est construit autour du chiffrement AES et la plupart des processeurs x86_64 et ARMv8 modernes implémentent une extension de jeu d'instructions AES. Cela permet de combler l'écart de performances entre le système prévu et un système de craquage dédié. (EDIT, févr.2019: Il semble que les nouvelles versions d'Argon2 ne soient pas compatibles avec l'implémentation AES dans les extensions matérielles. Voir les commentaires pour une discussion à ce sujet)
  4. Argon2 est particulièrement résistant au classement des attaques de compromis au-delà d'une fraction de mémoire d'un tiers, ce qui rend beaucoup plus difficile l'accélération à moindre coût sur les FPGA. En effet, les solutions de craquage basées sur FPGA sont principalement limitées par la bande passante mémoire, et avec la conception d'Argon2, l'attaquant doit avaler une grande augmentation du temps de calcul afin de réduire les besoins en bande passante mémoire, rendant ainsi le compromis inefficace. Vous pouvez en savoir plus à ce sujet dans la section 5.1 du Argon2 paper , avec des informations sur scrypt disponibles pour comparaison dans le tableau 6 (section 5) du papier - "Cryptanalyse de compromis des fonctions mémoire difficiles".
  5. Les paramètres de dureté de la mémoire et de dureté du processeur sont configurables séparément, avec un facteur de parallélisme. Cela vous permet de mieux adapter la sécurité liée à votre cas d'utilisation, comme un serveur avec une puissance CPU modérée et une grande quantité de RAM.

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:

  • 512 Mo de mémoire
  • 8 itérations
  • Facteur de parallélisme de 8

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.

53
Polynomial