Les mots de passe ne doivent pas être stockés en texte brut pour des raisons de sécurité évidentes: vous devez stocker les hachages, et vous devez également générer le hachage avec soin pour éviter les attaques de table arc-en-ciel.
Cependant, vous devez généralement stocker les n derniers mots de passe et appliquer une complexité minimale et un changement minimal entre les différents mots de passe (pour empêcher l'utilisateur d'utiliser une séquence comme Password_1, Password_2, ..., Password_ n ). Ce serait trivial avec des mots de passe en texte brut, mais comment pouvez-vous faire cela en stockant uniquement des hachages?
En d'autres termes: comment est-il possible de mettre en œuvre un mécanisme d'historique de mot de passe sûr?
Réponses:
Stockez les hachages et vérifiez un mot de passe saisi par rapport à ces hachages stockés, de la même manière que vous vérifiez un mot de passe lorsque vous vous connectez. Vous devrez générer des mots de passe «alternatifs» à partir de celui donné en fonction de modèles numériques pour détecter vos changements «minimes».
Lors de la connexion, vous vérifiez déjà le mot de passe saisi par rapport à un hachage, il n'est pas nécessaire de stocker le mot de passe en texte clair. La même astuce fonctionne quand il s'agit de changer un mot de passe, il suffit de vérifier les mots de passe entrés et générés par «changement minimal» par rapport aux hachages historiques. Si le nouveau mot de passe est satisfaisant, déplacez le hachage de mot de passe actuel vers l'ensemble historique et remplacez-le par un nouveau hachage pour le nouveau mot de passe.
la source
Lorsque l'utilisateur modifie son mot de passe, demandez-lui de saisir son mot de passe précédent. Vous avez désormais accès à deux mots de passe en texte brut, même si vous ne stockez pas de mots de passe en texte brut dans votre base de données.
Effectuez les vérifications que vous souhaitez sur ces deux mots de passe. Cela n'empêchera pas l'utilisateur d'alterner entre deux mots de passe (avec un suffixe - vous pouvez empêcher l'alternance directe selon les suggestions des autres réponses), mais cela empêchera les cas les plus flagrants.
la source
potatoSalad1
et qu'ils souhaitent mettre à jour verspotatoSalad2
, vous dites que la modification est trop petite car vous avez les deux mots de passe en texte brut à ce moment. Mais plus loin que cela, vous n'avez que des hachages, et la nature des hachages est que vous ne pouvez pas dire si deux hachages ont un texte brut similaire ou complètement différent en entrée.pour ajouter à la réponse de @ martijnPieter le changement minimal peut être implémenté en faisant une force brute courte basée sur les mots de passe nouveaux et précédents (que vous avez tous les deux disponibles)
par exemple, vous pouvez parcourir tous les mots de passe avec une distance de brouillage de 1 ou 2 du nouveau mot de passe et voir s'il correspond à un ancien mot de passe
mais vous voudrez peut-être noter que cela peut réduire la confiance des utilisateurs que vous hachez les mots de passe (car vous dites essentiellement que vous pouvez récupérer un mot de passe précédent pour rejeter un nouveau mot de passe)
la source
C'est vraiment plus un addendum à la réponse intelligente de @ Brian. Chapeau aussi à @Martijn Pieters pour avoir ajouté des détails sur la façon de forcer brutalement les anciens mots de passe basés sur le mot de passe actuel et à @ratchet freak pour "hamming distance". Je ne supprime pas ma réponse car je pense qu'elle fournit un contexte intéressant pour les sauvegarder.
Le stockage de mots de passe de pointe nécessite l'utilisation de plusieurs tours d'un hachage cryptographique à sens unique (SHA-512 +) avec un sel unique (128 bits +) pour chaque utilisateur. Mais ne soyez pas tenté de stocker des informations supplémentaires sur chaque mot de passe. Plus vous stockerez d'informations sur chaque mot de passe, plus vous compromettez la sécurité de votre algorithme de hachage.
Exemple
Considérez combien il est facile de forcer un mot de passe par brute-force si vous savez que:
Un clavier américain a 95 caractères imprimables, donc sachant que le mot de passe est de 7 caractères donne 95 ^ 7 = 69 833 729 610 000 = 7 x 10 ^ 13 permutations. S'il était vraiment aléatoire, cela pourrait prendre un an pour le casser sur un seul processeur 3Ghz. Mais:
Donc (corrigé grâce à @Hellion):
C'est 50 000 fois plus facile à casser! Le stockage de bonnes informations pour empêcher des mots de passe similaires dans ce cas a pris votre temps de crack pour un mot de passe à 7 caractères d'un an à quelques heures. Décoder tous vos mots de passe sur un bureau multiprocesseur puissant avec une bonne carte vidéo et un peu de patience est désormais très possible. J'espère que cet exemple simple démontre que plus vous pouvez comparer de mots de passe similaires de manière significative, moins votre hachage sera sécurisé.
Importance du hachage fort
Des bases de données avec des mots de passe sont régulièrement volées, avec des effractions gargantuesques dans l'actualité chaque mois. Heck, le mois dernier, l'état de SC a perdu les numéros de sécurité sociale de tout le monde - oups! Combien d'autres de ces violations sont couvertes?
Pensée de clôture
La chose la plus effrayante pour moi, c'est quand les gens choisissent le même mot de passe ou un mot de passe similaire pour plusieurs sites, de sorte que le fait d'en percer un donne à l'attaquant l'accès à tous. J'adorerais voir une méthode éprouvée pour prévenir cette situation, bien que je pense qu'empêcher les mauvais mots de passe les plus courants aiderait plus que d'empêcher un utilisateur individuel de réutiliser son mauvais mot de passe sur le même site. Le mieux que je puisse suggérer est une politique à l'échelle de l'entreprise pour utiliser un gestionnaire de mots de passe sécurisé qui génère des mots de passe hautement aléatoires pour chacun de vos utilisateurs et les stocke en toute sécurité.
la source
Tout d'abord, vous pouvez stocker les hachages pour les derniers "n" mots de passe précédents, afin que vous puissiez vérifier si leur nouveau mot de passe reproduit un mot de passe précédent. Vous avez également le texte brut de leur mot de passe actuel (car ils se sont connectés ou vous l'ont fourni pour authentifier leur demande de changement de mot de passe), et leur nouveau mot de passe, afin que vous puissiez vérifier les changements minimes entre ces deux mots de passe.
Si (pour vous) il est très important de comparer directement ces deux mots de passe avec "n" les mots de passe précédents, alors vous devez stocker ces mots de passe (cryptés) pour pouvoir les récupérer plus tard.
Bien que cela puisse être considéré comme une faille de sécurité pour ce faire, des méthodes de cryptage pourraient être mises en œuvre pour fournir une sécurité suffisante.
Ensuite, chaque fois que le mot de passe est modifié, vous pouvez décrypter tous les anciens mots de passe et effectuer tous vos tests de modification minimale.
Maintenant, si quelqu'un avait le mot de passe de cette personne et connaissait tous les autres détails nécessaires, il pourrait décrypter ces informations pour cette seule personne. Mais s'ils ont déjà le mot de passe de cette personne, ils peuvent déjà se connecter en tant que cette personne et accéder au compte de cette personne.
De plus, pour les anciens mots de passe, il se peut qu'ils n'aient pas à être stockés en texte strictement clair. Ils pourraient être stockés d'une manière obscurcie. Ou stocké sous forme de liste alphabétique des caractères du mot de passe.
Je ne dis pas que c'est une chose recommandée à faire dans le cas général, mais en supposant que la tâche que vous avez décrite est requise dans votre cas, alors c'est une façon de l'accomplir avec quelques mesures de sécurité.
la source