Comment mettre en œuvre un historique de mot de passe sûr

23

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?

Wizard79
la source
2
Connexes: security.stackexchange.com/questions/4704/… (et BTW ce site pourrait être un meilleur emplacement pour cette question). En ce qui concerne le `` changement minimal '', je ne peux penser à aucune alternative à la génération de toutes les options qui pourraient être qualifiées de `` changement minimal '' (ce qui pourrait être BEAUCOUP selon votre définition!) Et à comparer les hachages. Quelle est la définition de «changement minimal»?
Kevin Vermeer
7
Le stockage des n derniers mots de passe signifie uniquement que l'utilisateur choisira une séquence allant de 1 à n + 1 .
Joachim Sauer
11
Je suis très sceptique qu'une telle politique de mot de passe améliore la sécurité; À mon humble avis, cela augmente les chances que les gens recourent à garder leur mot de passe sur une note collante. Le lien de Kevin est une bonne discussion. @KevinVermeer - vous pouvez réellement mesurer la quantité de changement en tant que distance de Levenshtein ( en.wikipedia.org/wiki/Levenshtein_distance ), également connue sous le nom de "distance de modification".
Nathan Long
5
Si votre sécurité est aussi stricte, vous pouvez également générer un mot de passe aléatoire pour l'utilisateur, le forcer à l'utiliser et le changer à intervalles réguliers. De cette façon, vous avez un contrôle total sur leur mot de passe.
Reactgular
2
@nathan: Le stockage des mots de passe sur une note autocollante est en fait sécurisé. Il n'est pas possible d'attaquer le mot de passe à moins d'avoir un accès physique au pense-bête - éliminant environ 99% des menaces. Mettez cette note dans un portefeuille ou un sac à main, et vous devez essentiellement agresser la personne pour l'obtenir - ce qui signifie qu'une faille de sécurité est identifiée et peut être atténuée.
mattnz

Réponses:

22

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.

Martijn Pieters
la source
Donc, si l'utilisateur entre Password6, je devrais détecter la partie numérique et essayer par exemple Password4 , Password5 , Password7 , etc. Est-ce exact?
Wizard79
4
@ Lorenzo: Correct. La génération d'alternatives peut être aussi complexe que vous le souhaitez, assurez-vous simplement de trouver le bon compromis entre complexité et risque (ne laissez pas vos utilisateurs attendre 5 minutes pendant que vous vérifiez toutes les possibilités avec la probabilité disparue d'être un risque).
Martijn Pieters
Je ne suis pas sûr que suggérer d'augmenter le nombre à la fin soit une bonne suggestion à faire aux utilisateurs - c'est juste un peu prévisible. Et devient exponentiellement plus si vous dites aux utilisateurs de le faire.
Wyatt Barnett
2
@WyattBarnett: Personne ne dit aux utilisateurs de le faire. Le but est de détecter les utilisateurs qui le font et d'empêcher l'utilisation du mot de passe «incrémenté».
Martijn Pieters
Ah, complètement mal lu quelque chose ici. Désolé.
Wyatt Barnett
28

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.

Brian
la source
Eh bien, c'est certainement une solution de contournement intelligente si vous n'avez pas besoin de tester contre n mots de passe précédents, mais la suggestion de générer les alternatives juste à temps est meilleure. Mais générer des alternatives des deux mots de passe est encore mieux!
Wizard79
2
@ Lorenzo: L'idée est que vous fassiez un test direct contre les n mots de passe précédents et un test plus fort contre le dernier mot de passe. C'est un compromis.
Brian
Oui. Si leur mot de passe actuel est potatoSalad1et qu'ils souhaitent mettre à jour vers potatoSalad2, 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.
Nathan Long
7

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)

monstre à cliquet
la source
Mais il existe de nombreuses séquences avec de plus grandes distances de Hamming telles que février2012 -> mars2012 ou ven-09-28-12 -> mar-11-27-12 (dates), Password_Alpha -> Password_Beta, Pass_1111 -> Pass_2222, Pass_qwer, Pass_tyui, Pass, _op [] ou Eleven -> Twelve (systèmes de comptage alternatifs), ou FrankSmith -> FredJones -> FriarTuck ou colère -> animal -> apple (noms dans un répertoire d'entreprise ou mots dans un dictionnaire) qu'un attaquant avec le le (s) mot (s) de passe précédent (s) pourrait facilement deviner, mais que votre algorithme aurait un temps extrêmement difficile à générer.
Kevin Vermeer
@KevinVermeer tient alors compte de ceux qui sont en vous, générateur de variations, et acceptez que vous n'obtiendrez jamais tout
ratchet freak
+1 pour réduire la confiance. Quand je vois quelque chose me disant que mon mot de passe ressemble trop à celui que j'ai utilisé il y a trois mois, je me demande instantanément s'ils les stockent de manière réversible ... ou s'ils ont un programmeur génial. Le scepticisme l'emporte généralement.
Tim Post
5

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:

  • Il fait 7 caractères
  • Les caractères 3 à 5 sont en majuscules (4 est inférieur)
  • 1 et 7 sont des nombres
  • 6 est un symbole

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:

  • Il n'y a que 26 majuscules et 26 minuscules
  • Il n'y a que 10 chiffres donnant 100 possibilités pour ces deux nombres
  • Il n'y a que 32 symboles

Donc (corrigé grâce à @Hellion):

         26^4 (charcters 2-5 are known upper or lower-case)
        x 100 (characters 1 & 7 are digits)
        x  32 (character 6 is a symbol)
         ====
1,462,323,200 possible passwords.

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

GlenPeterson
la source
1
mineur: les possibilités de mot de passe sont toujours multiplicatives, donc c'est (26 ^ 4) * 100 * 32 = 1 462 323 200. Si nous supposons que les possibilités de craquage (95 ^ 7) prennent un an, alors le craquage de ce plus petit nombre de possibilités prendra environ 11 minutes.
Hellion
@Hellion - Oups! Merci d'avoir fait remarquer cela. Je l'ai corrigé.
GlenPeterson
1

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.

  1. Stockez chaque mot de passe (crypté), pour les derniers "n" mots de passe.
  2. Enregistrez la date et l'heure de création du mot de passe le plus récent.
  3. Stockez le hachage du mot de passe le plus récent.
  4. Chiffrez tous les mots de passe en utilisant le hachage (salé) du mot de passe actuel et l'horodatage de création du mot de passe, et peut-être quelque chose comme un numéro de compte ou une adresse e-mail.
  5. Déchiffrez et rechiffrez tous les mots de passe chaque fois qu'un nouveau mot de passe est créé.

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

Kevin Fegan
la source
Cette réponse fait plusieurs terribles suggestions en termes de sécurité. Nous ne devrions pas être en mesure de décrypter facilement les mots de passe, ni de les stocker de «quelque manière obscurcie» au lieu de les crypter fortement.
user45623