2010-05-11 3 views
7

Ma prochaine tâche sera de crypter les mots de passe. Je travaille à la couche d'accès à la base de données et mon collègue a fait cette demande: implémenter un hachage SHA-512 sur une méthode vide. Comment puis-je faire ceci?Comment faire pour hacher un mot de passe?

+16

Ne le faites pas. Laissez le cryptage du mot de passe aux experts en sécurité. Vous vous tromperez, et vous mettrez votre organisation en péril. Embaucher un expert c'est beaucoup moins cher que le coût de nettoyer le désordre après une attaque réussie contre les faiblesses que vous ne saviez pas que vous étiez en train d'ajouter à votre système de sécurité. –

+4

L'embauche d'un expert dépend de votre niveau de risque. Si vous stockez des informations privées pour les masses et que ce mot de passe est tout ce qui se trouve sur le chemin, oui cherchez un expert. La plupart des exemples ci-dessous suffiront pour votre projet d'information non confidentiel moyen. –

+1

@Eric - Je suppose que vous voulez dire par là "utiliser l'implémentation de SHA512 dans .NET au lieu de créer le vôtre", pas "utiliser les fournisseurs d'appartenances implémentés dans .NET pour votre sécurité." Je peux voir une certaine validité à la fois, mais alors que je suis d'accord à 100% avec le premier, je peux voir des situations où ce dernier n'est pas vraiment possible. En fait, il ne m'est jamais venu à l'esprit que quelqu'un envisagerait de mettre en place sa propre version de SHA-512. Votre commentaire m'a donc laissé perplexe pour savoir si je devais sous-traiter la sécurité de mes applications à quelqu'un de plus qualifié. :-) – tvanfosson

Répondre

10

un processus assez simple, vraiment:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample); 

using(SHA512 sha512 = new SHA512Managed()) 
{ 
    byte[] hash = sha512.ComputeHash(data); // Add Per User Salt as per the Below 
} 

hash contient maintenant un hachage non-reversible des données initiales que vous avez voulu HASHED. En outre, consultez MSDN. Quelques notes: (. Plus le mieux, et unique par utilisateur - Merci Paul, bon point)

  • Utilisez toujours un salt
  • SHA2 * génération (et SHA en général) les méthodes de hachage sont construits pour la vitesse , donc ils ne sont pas précaires, mais ils ne sont pas les plus sûrs. Regardez bcrypt ainsi que SLaks a mentioned.
+0

Un mot sur le downvote? Merci. –

+2

+1 de moi, bien qu'il serait utile de mentionner le sel devrait être unique par mot de passe. Et peut-être changer votre exemple pour inclure le sel – PaulG

+0

@Paul - Bon point, ajouté dans –

1

SHA512 Class

C# exemple de cette page:

byte[] data = new byte[DATA_SIZE]; 
byte[] result; 
SHA512 shaM = new SHA512Managed(); 
result = shaM.ComputeHash(data); 
+0

-1 pour utiliser le SHA-512 ordinaire, ce qui est rapide. Utilisez une fonction de dérivation de clé lente, telle que PBKDF2, bcrypt ou scrypt. – CodesInChaos

10

Vous devez utiliser bcrypt, qui est plus sûr pour les mots de passe que SHA512.

Si vous avez vraiment besoin d'utiliser SHA512, vous devez utiliser le SHA512Managed class, comme d'autres réponses l'ont mentionné.
Assurez-vous de saler votre hachage.

+2

intéressant, pas vu qu'avant – Pharabus

+0

ne saliez-vous pas le texte en clair avant le hachage? –

+0

@uncle brad: C'est ce que je voulais dire. – SLaks

7

Comment faire pour hacher un mot de passe?

Avec un sel. Vraiment.

Jamais, jamais faire ceci:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample); 

Mais ceci:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample + salt); 

C'est l'un des plus mal compris "truc du métier". La plupart des gens ne savent pas ce qu'est un "sel" et quand vous leur expliquez, ils pensent que c'est inutile.

La vérité est: SHA-512 ou MD5 ou un hachage très faible, une fois que les tables arc-en-ciel sont précalculées, cela ne fait aucune différence. SHA-65536, devrait-il exister (je suis facétieux ici), ne serait pas meilleur que n'importe quel autre algorithme de hachage une fois que les tables arc-en-ciel sont précalculées.

Un assez grand « sel » fait des tables arc-en-impossible:

http://en.wikipedia.org/wiki/Rainbow_table

Notez que même si vous comprenez comment hashes, tables de sel et arc-en-relation (et donc comprendre pourquoi les états de l'article de Wikipédia: "Un sel est souvent utilisé avec des mots de passe hachés pour rendre cette attaque plus difficile, souvent infaisable.") il y a une très forte probabilité que vos collègues ne le fassent pas. Tout comme il est très probable que la plupart des gens de haut en bas dans ce fil ne comprennent pas ce sujet.

J'ai vu des réponses ici sur SO avec 30 upvotes où quelqu'un qui ne pouvait pas comprendre ce que le sel a été maintenu à venir avec techno-buzzwords pour défendre sa position ... Et pourtant il avait toutes ces upvotes (trop paresseux pour trouver la question mais c'était épique).

+1

Et vous devez utiliser 'RNGCryptoServiceProvider' pour créer votre sel pour chaque nouveau hachage, et stocker à la fois le hachage et le sel. – Will

+0

Un sel seul ne suffit pas. La fonction de hachage devrait également être lente. Utilisez PBKDF2, bcrypt ou scrypt. – CodesInChaos

Questions connexes