Disons que j'ai une base de données avec un tas d'utilisateurs dedans. Cette base de données utilisateur aurait généralement un mot de passe haché par utilisateur. Serait-ce une mauvaise pratique de préfixer ce hachage avec l'algorithme de hachage utilisé?
Par exemple, au lieu du hachage aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
, Je stocke sha1_aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
, car la méthode de création du hachage est SHA1.
J'ai remarqué qu'Argon2 fait cela, et je pense en fait que c'est assez pratique, car cela facilite la migration partielle vers de nouveaux algorithmes de hachage pour les nouveaux utilisateurs au fil du temps.
Je n'utilise pas SHA1 dans mon code de production pour les mots de passe. SHA1 a été choisi au hasard. Cette question ne concerne pas l'utilisation de la méthode de hachage.
De nombreux systèmes de hachage de mot de passe différents le font. Le type de mécanisme de hachage utilisé ne devrait pas être (et ne devrait pas être) un secret. principe de Kerckhoffs dit:
Un cryptosystème doit être sécurisé même si tout ce qui concerne le système, à l'exception de la clé, est de notoriété publique.
Donc, si votre système est correctement sécurisé, peu importe si le mécanisme de hachage est exposé.
Je suis d'accord avec schroeder que c'est OK à faire. Même sans préfixe, un attaquant peut probablement comprendre quel algorithme vous utilisez. Et de toute façon, c'est la force de l'algorithme de hachage qui protège les mots de passe, pas le secret de l'algorithme.
Notez que de nombreux algorithmes et bibliothèques de hachage le font déjà pour vous. Ils intègrent toutes les informations pertinentes - algorithme, facteurs de coût, sel, hachage réel - dans une chaîne sérialisée. Voir par exemple la fonction Modular Crypt Format ou PHP password_hash . Donc, ne créez pas votre propre schéma. Si vous êtes en utilisant une bibliothèque de hachage de descente, vous en avez déjà une.
Cependant, n'utilisez pas SHA1 pour hacher les mots de passe. Ce n'est pas OK.
Non, ce n'est pas une mauvaise pratique, et sans doute, vous devriez conserver ces informations.
Comme vous le constatez, cela vous permet de changer d'algorithme pour les nouveaux mots de passe quand vous le souhaitez, sans invalider les mots de passe existants de tous les utilisateurs (cela a tendance à vous rendre impopulaire, pour une raison quelconque).
Il existe un argument selon lequel cela permet à un attaquant de rechercher les mots de passe les plus anciens et les plus faibles pour attaquer en premier, mais vous n'avez pas du tout réduit leur sécurité (en supposant le principe de Kerckhoff, que l'algorithme lui-même ne doit pas nécessairement être un secret).
Il est recommandé de stocker l'algorithme de hachage, mais les fonctions de hachage de mot de passe appropriées telles que Argon2 et PBKDF2 s'en occupent déjà. Il est cependant mauvais d'utiliser SHA1 ou SHA256 seul pour le hachage de mot de passe car ils représentent une quantité de travail fixe (et relativement petite) à craquer à l'aide d'attaques de dictionnaire et de la force brute. Ces mots de passe doivent être migrés vers une fonction de hachage sécurisée en ressassant le mot de passe lors de leur prochaine connexion. Voir https://crypto.stackexchange.com/a/45405 pour plus de détails.
Ce n'est pas une mauvaise pratique, c'est en fait une chose courante à faire. En fait, si vous ouvrez le /etc/shadow
fichier sur une machine Linux, vous verrez votre mot de passe haché préfixé avec $ x $ salt $ où x est un nombre indiquant quel algorithme de hachage a été utilisé.
Maintenant, quelques éléments à considérer: