2010-06-23 9 views
1

Je suis un peu un débutant autour de la sécurité Nitty gritties et surtout autour de la cryptographie..NET 3.5 - Hashing un mot de passe en utilisant System.Cryptography

Dans l'application que nous construisons (application ASP.net basée sur .NET 3.5), nous utilisons actuellement des bases de données pour enregistrer les informations d'authentification de nos utilisateurs (AD etc n'est pas une option à ce stade). L'intention est de faire un hachage salé à sens unique des mots de passe en utilisant SHA256Managed sur la création de l'utilisateur, puis de valider les utilisateurs utilisant le même. Idéalement, nous ne voulons utiliser aucune DLL tierce pour l'algorithme de hachage à moins que cela ne soit absolument nécessaire pour éviter les dépendances inutiles.

Questions: - 1. Y a-t-il une meilleure option que de faire un hachage salé à sens unique? 2. SHA256 est-il une option raisonnablement fiable/sécurisée ou devrions-nous envisager autre chose? 3. L'implémentation SHA256Managed dans System.Cryptography est-elle suffisante en termes de rapidité, etc. ou devrions-nous envisager des alternatives tierces?

Tous les pointeurs concernant l'approche/la mise en œuvre seront utiles.

Répondre

0
  1. Oui, scan rétine (just kidding). Stocker les mots de passe comme des hachés avec du sel est la bonne façon.
  2. SHA256 est bon. Évidemment, je ne connais pas le type d'application sur laquelle vous travaillez, mais SHA256 est bon pour la grande majorité des projets. Vous pouvez toujours aller à une longueur de clé plus élevée (384, 512) si nécessaire. Consultez votre architecte de sécurité.
  3. SHA256Managed (nous parlons .net, non?) Est bon. Nous l'utilisons dans nos projets.

S'il vous plaît considérer également lire ceci: http://www.obviex.com/samples/hash.aspx

+0

Oui. C'est une implémentation .NET à laquelle je faisais référence. Merci pour le lien. – InSane

+0

Salut, Comme il ya une préférence pour l'utilisation d'algorithmes intégrés dans le framework .NET lui-même, je pense que c'est peut-être l'option que je vais suivre pour le moment. Merci pour l'aide. La décision d'utiliser SHA256Managed/SHA512Managed est en attente. – InSane

+1

-1 pour affirmer que SHA-2 est bon pour le hachage par mot de passe. C'est trop rapide. Utilisez PBKDF2, bcrypt ou scrypt à la place. – CodesInChaos

0

Oui, il n'y a rien de mal avec SHA256 et certainement SHA256Managed sera "assez rapide" pour la plupart des cas d'utilisation (je suis sûr que vous ne vous attendez pas à valider 1000 demandes de connexion par seconde, et même si le reste du site écraserait encore les demandes de connexion ...)

Mais avez-vous considéré le Membership intégré au framework? Ils sont déjà fait tout le travail en termes de références stocker de manière sécurisée, et mettre en œuvre toutes les fonctionnalités de support ainsi (par exemple les réinitialisations de mot de passe, etc.)

+0

Actually..i avait entendu parler de l'étoffe des membres, mais pas vraiment exploré encore. Ton commentaire m'a rappelé que j'en avais besoin. Merci! :-) – InSane

2

J'ai fait quelques recherches sur ce retour dans la journée, et le consensus était Bcrypt était l'une des meilleures façons de faire un hachage à sens unique.

Vous pouvez voir une implémentation C# ici: http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

De plus, ce qui est agréable au sujet Bcrypt est que vous pouvez décider combien de tours que vous souhaitez qu'il traverser. Ainsi, vous pouvez faire en sorte qu'il faut environ 1 seconde pour crypter par exemple. Pour un utilisateur, c'est un temps d'attente acceptable, mais pour quelqu'un qui essaie de vous attaquer par la force brute, 1 seconde est une éternité. Je ne suis pas un expert en sécurité, alors prenez ce que je dis ici comme un grain de sel.Un sel que vous pouvez envoyer à votre méthode bcrypt :)

De plus, voici quelques conseils de Atwood à ce sujet: http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

Mise à jour:

Depuis répondre à cela, NuGet a fait en utilisant Bcrypt beaucoup plus facile: http://nuget.org/packages?q=bcrypt

Je ne peux pas garantir une implémentation particulière là-bas, alors jetez un oeil sur le code, mais cela devrait faciliter l'utilisation et l'intégration de BCrypt.

+0

Merci CubanX, je vais certainement chercher BCrypt – InSane

+0

Un peu plus faible que bcrypt, mais faisant déjà partie de l'infrastructure .net: PBKDF2-SHA-1 utilisant la classe [Rfc2898DeriveBytes] (http://msdn.microsoft.com/fr-fr/library/system.security.cryptography .rfc2898derivebytes.aspx). – CodesInChaos

0

Le stockage des mots de passe avec salt est correct. Cependant, il est facile de se tromper. Bien sûr, en ce moment SHA256 tiendra les méchants à distance, mais lui donner quelques années. Soudainement, SHA256 pourrait ne plus être aussi sécurisé. Vous devez utiliser BCrypt, un futur-preuve algorithme de hachage.

0

Problème avec un seul passage de SHA256, il est trop rapide et un avec un bon matériel peut facilement générer des tables arc-en-ciel pour beaucoup de sels ... pour contourner cela, vous devez effectuer des étirements de touches .... Je ne vais pas vous donner une leçon sur l'étirement des clés, mais l'implémentation de bcrypt dont parlent les gens effectue des étirements clés. Si vous voulez une alternative plus moderne à Bcrypt qui utilise HMACSHA256 ou 512 dans .NET, je recommande cette API:

https://sourceforge.net/projects/pwdtknet/

Questions connexes