Tout le monde sait que s'ils ont un système qui nécessite un mot de passe pour se connecter, ils devraient stocker une copie hachée et salée du mot de passe requis, plutôt que le mot de passe en texte clair.
Ce que j'ai commencé à me demander aujourd'hui, c'est pourquoi ne stockent-ils pas également l'ID utilisateur dans un mot de passe similaire haché et salé?
Pour moi, cela semblerait logique car je ne vois aucun inconvénient, et si la base de données était compromise, les attaquants devraient "cracker" le mot de passe et le hachage du nom d'utilisateur avant de pouvoir compromettre ce compte. Cela signifierait également que si les noms d'utilisateur étaient des adresses électroniques hachées et salées, ils seraient plus protégés contre la vente aux SPAMmers.
Alors que ce que Terry dit est vrai, parfois les systèmes de connexion hachent en fait le nom d'utilisateur (mais sans sel). Ils vous font choisir un nom de connexion et un nom d'affichage. Le nom de connexion est stocké haché (sans sel car vous devez pouvoir le rechercher) et le mot de passe est salé. Le nom d'affichage est différent de votre nom de connexion (car il doit également être gardé secret) et est affiché lorsque cela est nécessaire.
Même lorsqu'un attaquant voit votre nom, il ne pourra pas le joindre à votre nom de connexion. Bien que je dis qu'il peut être salé, cela n'est en fait pas nécessaire. La partie la plus importante est juste de garder le secret. Si la base de données est compromise, des éléments tels que votre adresse e-mail ou votre nom seront toujours là pour que l'attaquant puisse utiliser s'il souhaite lancer de nouvelles attaques sur vos autres comptes.
Vous voyez cette chose là-haut où elle affiche votre nom d'utilisateur? Ils ne peuvent pas faire cela si le nom d'utilisateur est stocké haché maintenant, n'est-ce pas?
Un mot, la convivialité.
Généralement, les noms d'utilisateur ne sont pas considérés comme sécurisés, ils sont une identité et non une authentification. Il est bon de ne pas révéler les noms d'utilisateur valides, mais ce serait pire si vous aviez une collision. Vous pouvez toujours contourner cela en regardant tous les noms d'utilisateur correspondants pour un hachage de mot de passe correspondant, mais c'est un peu compliqué.
De manière réaliste, si vous disposez d'une bonne sécurité par mot de passe et de limites de tentatives de connexion, une liste complète de noms d'utilisateur offre peu de valeur pratique à un attaquant. Son principal avantage serait le phishing, mais si votre correspondance officielle contient des informations, ces informations ne peuvent pas être hachées et elles l'obtiendraient si elles compromettaient votre base de données de toute façon.
En outre, la convivialité comme Terry l'a dit. Il est beaucoup plus facile de trouver votre compte s'ils peuvent voir les noms d'utilisateur. Vous ne gagnez pas assez en essayant de sécuriser un identifiant pour le justifier dans la plupart des contextes.
Alors que d'autres ont bien souligné qu'il y a peu (le cas échéant) d'avantages, je serais en désaccord avec votre affirmation selon laquelle il n'y a pas d'inconvénients. Si vous stockez uniquement le nom d'utilisateur haché, la recherche du nom d'utilisateur est facile. Si vous stockez un nom d'utilisateur salé et haché, la recherche devient un peu plus problématique.
Supposons que si nous construisons une table SQL contenant des noms d'utilisateur et des mots de passe (hachés) et disons au serveur SQL d'indexer la colonne de nom d'utilisateur qu'il fera une sorte de recherche binaire ou une autre magie. Nous pourrions avoir une table qui ressemble à:
Username | Password
test | j9lnvqjAuhNJs
(Il s'agit du hachage cryptique Unix à l'ancienne (3) juste pour la simplicité et la brièveté.)
Si vous stockez vos noms d'utilisateur en texte brut, la récupération du mot de passe (haché) pour un utilisateur est un simple appel SQL. Supposons que vous souhaitiez valider les informations d'identification d'un utilisateur qui a tapé le nom d'utilisateur test
:
SELECT password FROM users WHERE username='test`;
Assez simple. Maintenant, si nous devions stocker les noms d'utilisateur dans le même format que les mots de passe, notre tableau finit par ressembler à ceci:
Username | Password
M1CAtvzDdJDGU | j9lnvqjAuhNJs
Maintenant, lorsqu'un utilisateur saisit son nom d'utilisateur de test
, comment validez-vous le mot de passe? Une recherche binaire est inutile ici, car vous ne connaissez même pas le sel que vous avez utilisé pour stocker le nom d'utilisateur. Au lieu de cela, vous devez parcourir chaque nom d'utilisateur dans la base de données, crypt
ing le nom d'utilisateur donné avec le sel de ce nom d'utilisateur et le comparer au nom d'utilisateur stocké (haché) pour voir s'il correspond. Youch!
Supposons que vous ayez pris de bonnes précautions et utilisé un hachage lent Nice comme bcrypt
au lieu d'une bonne vieille crypte Unix? Double youch!
Comme vous pouvez l'imaginer, il y a de sérieux inconvénients à stocker un nom d'utilisateur haché salé au lieu d'un simple texte en clair.
Votre idée est noble et la question intéressante. Maintenant, je crois que vous soit ne pensiez pas du tout à la convivialité en soulevant la question o vous avez manqué le point de hachage (ou peut-être vous "cryptage" mal orthographié).
Le hachage est irréversible, à moins que vous n'ayez des superordinateurs pour forcer les choses ou des tables Rainbow pour essayer de rechercher des hachages. Par conséquent, la convivialité serait en baisse si vous deviez hacher les noms d'utilisateur/e-mails utilisés pour les connexions. Si, toutefois, on devait "chiffrer" le même en utilisant une clé prédéfinie dans le programme (celui qui vérifie le nom d'utilisateur) lui-même, alors cela pourrait être un peu sécurisé. Cependant, encore une fois - une clé de chiffrement stockée directement dans un programme est tout aussi bonne qu'aucune clé. Ce sont les principales raisons pour lesquelles les noms d'utilisateur ne sont ni hachés ni chiffrés.
Je pense que la raison la plus probable est que le hachage des noms d'utilisateur avec le mot de passe ne donne en fait aucune protection supplémentaire.
Nous encourageons les utilisateurs à créer des mots de passe difficiles et complexes, ce qui les rend plus difficiles à déchiffrer. Toute base de données de noms d'utilisateurs hachés peut être piratée en quelques minutes avec un dictionnaire de base ... à moins que vous ne demandiez à vos noms d'utilisateur d'avoir au moins 6 caractères alphanumériques;)
Si vous avez haché et salé le nom d'utilisateur, comment le système pourrait-il savoir que les nouveaux comptes avaient un nom d'utilisateur unique, sans parcourir tous les enregistrements existants et hacher le nouveau nom d'utilisateur avec chaque sel existant?
Cette idée est conforme à deux tactiques: 1) la sécurité par l'obscurité, 2) l'atténuation supplémentaire des attaques de synchronisation (si vous utilisez une fonction de comparaison sûre de synchronisation). Vous ne pouvez pas utiliser un sel unique pour le faire efficacement, mais c'est une bonne idée. Cela permettrait de séparer la table contenant les informations de connexion de celle contenant les informations "personne". Deux tableaux alors, personne (peut contenir des adresses e-mail en texte brut) et utilisateur (peut contenir un nom d'utilisateur haché {site wide salted} et un mot de passe haché et uniquement salé). La recherche de l'utilisateur par nom d'utilisateur haché n'est pas un problème.
Je pense que c'est une excellente idée. Comme l'a exprimé Anthony Rutledge; cela peut assurer la sécurité par l'obscurité/l'obscurcissement et si vous utilisez une fonction de dérivation de clé, telle que PBKDF2, il y a, je suppose, une difficulté accrue, par ordre de grandeur, pour un attaquant potentiel qui tenterait de compromettre une base de données volée.
Par exemple, une attaque par force brute hors ligne tentée sur une base de données volée nécessiterait de trouver des collisions de hachage pour le nom d'utilisateur et le mot de passe, malgré le fait que le salage du nom d'utilisateur dans la méthode, comme je l'ai mentionné ci-dessus, rendrait toutes les collisions de noms d'utilisateur identifiées sans objet .
Cela signifie que les attaquants devraient réquisitionner votre machine et également identifier et comprendre votre code source, car le sel n'existerait nulle part dans votre base de données. Il ajoute plusieurs couches de défense supplémentaire, sans augmenter considérablement, le cas échéant, la charge de calcul de l'application Web.
En ce qui concerne les problèmes de hachage: le nom d'utilisateur peut être salé avec un hachage côté serveur propriétaire, basé sur le nom d'utilisateur/e-mail réel.
Cela signifierait que le sel est connu, bien que par programme. Et le script qui calcule et renvoie le sel peut résider sur la machine d'une manière hors bande, par rapport au service Web - de sorte que toute méthode de génération du sel pourrait être inaccessible à partir de tous les points d'entrée Web.