Comment mettre à jour un système de stockage de mot de passe (modifier l'algorithme de hachage)

StackOverflow https://stackoverflow.com/questions/1533744

Question

On m'a demandé de mettre en œuvre des changements / mises à jour sur un intranet site; faire « preuve avenir » comme ils l'appellent.

Nous avons constaté que les mots de passe sont hachés en utilisant l'algorithme MD5. (Le système a été autour depuis 2001 il était temps suffisant).
Nous aimerions maintenant mettre à niveau le hachage algorithme à une plus forte (Bcrypt-hachage ou SHA-256).

Nous ne savons évidemment pas les mots de passe et-plaintext la création d'un nouveau mot de passe pour la base d'utilisateurs est pas une option *) .

Alors, ma question est:

Quel est le moyen accepté de changer l'algorithme de hachage sans avoir accès aux mots de passe en clair? La meilleure solution serait une solution qui est tout à fait « dans les coulisses ».

*) nous avons essayé; essayé de les convaincre, nous avons utilisé l'argument de « l'âge de mot de passe », a essayé de les corrompre avec du café, essayé de les corrompre avec des gâteaux, etc., etc. Mais il est pas une option .

Mise à jour J'espérais une sorte de solution automagique pour résoudre le problème, mais apparemment il y a pas d'autres options que simplement «attendre que l'utilisateur de se connecter, puis convertir.

Eh bien, au moins maintenant je maintenant il n'y a pas d'autre solution disponible.

Était-ce utile?

La solution

Tout d'abord, ajouter un champ à la base de données pour déterminer si oui ou non le mot de passe utilise MD5 ou le nouvel algorithme.

Pour tous les mots de passe en utilisant toujours MD5:

- Dans le processus de connexion, où vous vérifiez le mot de passe saisi d'un utilisateur: stocker temporairement le mot de passe soumis par l'utilisateur dans la mémoire (pas de problème de sécurité ici, car il est déjà en mémoire quelque part) et faire le hachage MD5 habituelle et comparer avec les hachage stockée;

- Si le mot de passe a été donné (correspond au hachage existant), exécutez le mot de passe stockés temporairement dans le nouvel algorithme, stocker cette valeur, mettre à jour le nouveau champ pour identifier que ce mot de passe a été mis à jour le nouvel algorithme <. / p>

(Bien sûr, vous suffit d'utiliser le nouvel algorithme pour les nouveaux utilisateurs / nouveaux mots de passe.)

Autres conseils

Je ne suis pas tout à fait sûr de cette option, puisque je ne suis pas un expert en cryptographie. S'il vous plaît me corriger si je me trompe à un moment donné ici!

Je pense que Dave P. a clairement la meilleure option.

... mais. Il existe une solution automagic - Hacher le plus se hachages. Cela est, prendre les hash en cours, et les hacher à nouveau avec un algorithme plus fort. Notez que pour autant que je comprends, vous ne recevez pas de sécurité supplémentaire de longueur de hachage ici, seule la complexité ajoutée du cryptographiques nouvel algorithme.

Le problème est, bien sûr, que la vérification d'un mot de passe devrait alors passer par les hash . Et vous auriez à faire la même chose pour le nouveau mot de passe ainsi Evey. Ce qui est, bien, assez bien idiot . À moins que vous souhaitez utiliser un système similaire comme Dave P. explique leur diplôme par la suite revenir à des mots de passe simple avec le nouveau hashed algorithme de hachage ... dans ce cas, pourquoi même pas la peine avec cela? (D'accord, vous pouvez l'utiliser dans un flashy « Amélioration de la sécurité pour tous les mots de passe, appliqué immédiatement! » - façon lors d'une présentation à des poursuites d'entreprise, avec un visage relativement simple ...)

Pourtant, il est une option qui peut être appliquée immédiatement à tous les mots de passe en cours, sans phase de migration progressive.

Mais garçon, oh boy, est quelqu'un va avoir un bon rire regardant ce code plus tard! :)

Ajouter un champ datetime passwordChange à la base de données.

Tous mot de passe défini avant le jour X, vérifier l'utilisation MD5

Tous les mots de passe définis après jour X, vérifiez à l'aide Bcrypt ou autre.

Vous pouvez stocker, que ce soit dans le domaine de hachage lui-même (par exemple « MD5: d41d8cd98f00b204e9800998ecf8427e ») ou dans une autre colonne, l'algorithme a été utilisé pour créer ce hachage. Ensuite, vous auriez à modifier le processus de connexion pour utiliser l'algorithme correct lors de la vérification du mot de passe. Naturellement, tous les nouveaux mots de passe encodé en utilisant le nouvel algorithme. Il faut espérer que les mots de passe éventuellement viennent à échéance, et au fil du temps tous les hash MD5 seront éliminés.

Puisque vous ne connaissez pas le mot de passe en texte clair, peut-être vous devriez créer un champ qui indique la version encription (comme PasswordVersion bit default 0)

utilisateur La prochaine fois que tente de se connecter, vérifier le mot de passe en utilisant la version de hachage algorithme actuel, comme vous le faites aujourd'hui. Si elle correspond, hachage à nouveau et mettre à jour champ PasswordVersion.

vous avez besoin d'une peu de chance ne colonne PasswordVersion plus grand que bit. =)

Vous devez modifier votre base de données de mot de passe pour stocker 3 éléments:

  1. un identifiant d'algorithme.
  2. Une chaîne de sel aléatoire choisi par le serveur lors de son premier calcule et stocke le hachage de mot de passe.
  3. Le hachage de la concaténation de sel + mot de passe en utilisant l'algorithme spécifié.

Bien sûr, ce pourrait juste être stockés ensemble dans un champ de texte avec un séparateur:

  

"SHA256: this-is-sel: this-is-valeur de hachage"

Maintenant vous convertir les entrées existantes à une valeur de sel vide et l'ancien algorithme

  

"MD5 :: this-is-the-old-md5-hash-sans-sel"

Maintenant, vous avez suffisamment d'informations pour vérifier toutes les entrées de mot de passe existants, mais vous pouvez également vérifier les nouvelles entrées (puisque vous savez que la fonction de hachage a été utilisée). Vous pouvez convertir les anciennes entrées au nouvel algorithme la prochaine fois que les utilisateurs existants connectez-vous puisque vous aurez leur mot de passe disponible au cours de ce processus:

  1. Si votre base de données indique qu'ils utilisent l'ancien algorithme sans sel, d'abord vérifier le mot de passe à l'ancienne en vérifiant que le hachage MD5 des correspondances de mot de passe. Dans le cas contraire, rejeter la connexion.
  2. Si le mot de passe a été vérifié, que le serveur choisir une chaîne de sel aléatoire, calculer le hachage SHA256 du sel + mot de passe, et remplacer l'entrée de table de mot de passe avec un nouveau specifiy le nouvel algorithme, le sel et le hachage.
  3. Lorsque l'utilisateur se connecte à nouveau, vous verrez qu'ils utilisent le nouvel algorithme, donc calculer le hachage du sel + mot de passe et vérifier qu'il correspond au hachage stocké.

Finalement, après ce système a fonctionné pendant un temps approprié, vous pouvez désactiver les comptes qui ne sont pas convertis (le cas échéant).

L'ajout d'une chaîne de sel aléatoire unique à chaque entrée rend ce système beaucoup plus résistant aux attaques par dictionnaire en utilisant des tables arc en ciel.

La meilleure réponse est d'un expert en cryptographie réelle https://paragonie.com/ blog / 2016/02 / how-sécurité magasin mot de passe en 2016 # legacy-hash

Ce poste permet également d'expliquer que vous devez utiliser le hachage. Il est toujours d'actualité même si elle dit 2016. Si l'utilisation de doute bcrypt.

Ajouter une colonne à vos comptes utilisateur table, appelée legacy_password (ou équivalent). Ceci est juste un booléen

Calculer la nouvelle plus forte hachage des mots de passe existants hash et les stocker dans la base de données.

Modifier votre code d'authentification pour gérer le drapeau de l'héritage.

Lorsqu'un utilisateur tente de se connecter, vérifiez d'abord si le drapeau legacy_password est réglé. Si elle est, d'abord pré-hachage de mot de passe avec votre ancien algorithme de hachage de mot de passe, puis utilisez cette valeur prehashed en place de leur mot de passe. Ensuite (md5), recalculer le nouveau hachage et stocker le nouveau hachage dans la base de données, la désactivation de l'indicateur legacy_password dans le processus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top