2011-01-08 1 views
1

Nous avons une ancienne application ASP héritée qui stockait les mots de passe des clients sous forme de hachages MD5 salés. Nous avons écrit une nouvelle application dans ASP.NET MVC pour remplacer cela.Renforcement de la sécurité d'un nouveau système basé sur une base de données existante

Je voudrais augmenter la protection du champ de mot de passe d'un cran et utiliser le hachage SHA1. Évidemment, je dois le faire sans forcer les clients à renouveler leurs mots de passe pour créer un nouveau hachage SHA1. Mes pensées étaient de hacher les hachages MD5 existants en utilisant SHA1. Cela signifie que j'aurais encore besoin de hacher avec MD5 puis de hacher à nouveau avec SHA1 lorsque les clients se connecteront et qu'ils réinitialiseront les mots de passe, mais je peux vivre avec cela.

Quelqu'un peut-il déceler des défauts dans cette méthode? Pour moi, il semble que

Répondre

1

Plutôt que d'utiliser SHA1, vous devriez utiliser Bcrypt ou quelque chose comme ça. Mais sinon, votre système semble raisonnable. Heureusement, les hachages existants ont un format facile à identifier, vous pouvez donc ajouter un préfixe d'identifiant si vous ne voulez pas ajouter une nouvelle colonne à la base de données. Je suggère de modifier le code pour pouvoir gérer md5, md5 + bcrypt ou bcrypt, alors vous pouvez exécuter un processus en arrière-plan pour mettre à jour les mots de passe de md5 à md5 + bcrypt, tandis que le code de connexion en ligne se met à bcrypt?

+0

Merci Douglas. BCrypt aiguise mon appétit. – Kev

1
  1. aggrandir la colonne pour soutenir le hachage
  2. introduisons une deuxième colonne pour déterminer la stratégie de hachage (ou voir ci-dessous); par défaut à MD5 (puisque c'est le hachage actuel)
  3. Modifiez les routines de modification/réinitialisation de mot de passe (et similaires) pour détecter la stratégie de hachage utilisée en fonction de cette valeur, puis appliquez-la; si la valeur est hachée avec un hachage "obsolète", alors mettez-le silencieusement (puisque vous aurez le mot de passe en texte brut de l'utilisateur une fois que vous l'aurez vérifié)
  4. Après un délai raisonnable, pensez à verrouiller les utilisateurs qui n'ont pas mis à jour vieux hashs

Vous peut détecter automatiquement des stratégies de hachage, par exemple MD5 par rapport à SHA1, basé sur la longueur de leur sortie codée - MD5 hexadécimal occupe 32 octets, tandis que SHA1 nécessite 40. Cependant, la «stratégie de hachage» peut également incorporer des informations (significative pour les applications - assurez-vous de le documenter soigneusement!) sur toutes les autres opérations effectuées sur le hachage, comme un mécanisme de salage, ou le nombre d'itérations de hachage, et est généralement un peu plus robuste. À l'avenir, vous pourriez vouloir introduire un troisième hachage (disons Tiger-192) et répéter le processus de mise à niveau.

Si vous ne pouvez pas épargner une autre colonne, élargissez celle existante pour prendre en charge le préfixage avec un indicateur du hachage, par ex. {SHA1}xxxxxxxxxxxxx - les anciens hash ne seront pas préfixés et peuvent être supposés être MD5.

+0

J'essaye de faire ceci avec le code supplémentaire minime (autre que re-hachage avec SHA1). La colonne est déjà assez grande ('varchar (1024)') donc pas de problème. Je veux également implémenter immédiatement cette mise à jour pour tout le monde et je préfère ne pas attendre que les clients se reconnectent pour effectuer une mise à niveau silencieuse (c'était une stratégie à laquelle j'avais pensé aussi). Cependant votre conseil est très utile. – Kev

Questions connexes