Comment puis-je utiliser salage + hachage sur mon application ASP.Net?

Je construis un projet à partir de zéro et je veux faire les choses de la bonne façon. J'ai lu en ligne sur les hashs et c'est en fait en tournant un mot de passe en 64 lettres de mumbo jumbo, correct?

Qu'en est-il du salage?

Mes questions sont:

  1. Comment puis-je hacher une string en utilisant C #?
  2. Quel serait le type de déclaration de champ dans MSSQL? nvarchar (64)?
  3. Qu'est-ce que le salage et dois-je l'save quelque part dans ma database?
  4. Si j'ai l'intention de laisser les gens utiliser Facebook Connect, dois-je m'inquiéter de créer un hachage / sel?

Les exemples de code sont préférés. Merci!

Je vais sauter la question 1 car je ne suis pas une personne C #.

Question 3:

Salting ajoute une string de données randoms au mot de passe avant le hachage. Les sels sont essentiels car sans eux, il est possible pour un attaquant de pré-générer une table arc-en-ciel de hachages de passwords connus. Le salage signifie que les tables arc-en-ciel ne peuvent pas être préconstruites, ce qui signifie que chaque mot de passe doit être forcé séparément.

Il est important de générer un nouveau sel pour chaque mot de passe.

Les valeurs de sel ne sont pas secrètes et peuvent être stockées à côté du mot de passe haché dans votre database.

Le pseudocode pour générer et vérifier un mot de passe est le suivant:

generatePassword(Ssortingng user, Ssortingng password) { Ssortingng salt = generateRandomSalt(); Ssortingng salted = salt + password; Ssortingng hash = hexEncode(hash(salted)); store(user, hash, salt); } checkPassword(Ssortingng user, Ssortingng testPassword) { Ssortingng salt = lookupSalt(user); Ssortingng salted = salt + testPassword; Ssortingng testHash = hexEncode(hash(salted)); return testHash.equals(lookupHash(user)); } 

Question 2:

La longueur du champ de database dépend de l'algorithm de hachage. SHA1 génère une sortie de 160 bits, donc 40 caractères si codé en hexadécimal. Une bonne règle est d'utiliser un sel de la même taille que la sortie de hachage, donc vous aurez deux colonnes de 40 caractères: une pour le sel, et une pour le hachage.

Question 4:

Aucune idée de comment fonctionne Facebook Connect, désolé. J'espère que les deux autres réponses sont utiles.

1) Code

  public static ssortingng HashSsortingngSha1(ssortingng plainText, ssortingng salt) { using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) { byte[] bb = sha1.ComputeHash(Encoding.UTF8.GetBytes(salt + plainText + plainText)); return Convert.ToBase64Ssortingng(bb); } } 

2) Stocker la string base64 dans SQLserver varchar

3) Stockez le sel dans un champ différent avec le hachage. Sel en text brut.

4) Je ne suis pas sûr de ce que vous voulez dire. Si vous utilisez OpenId, vous n'avez pas besoin de stocker les passwords.

Hash & salt sont utilisés pour garder votre mot de passe user en toute security. MD5 hash est l'algorithm le plus populaire utilisé. Les fonctions de hachage sont irréversibles -> vous ne pouvez pas get le mot de passe du hash, mais quelqu'un quelque part pensé – hé! Nous allons générer une table qui contient des exemples de passwords et leurs hashes puis sortinger cela et faire une simple search pour vérifier le mot de passe. C'est pourquoi le sel a été introduit – le sel est ajouté au mot de passe de l'user puis haché. Le sel est généré de manière random et devrait donc être conservé dans la database pour chaque hash.

Pour les détails de la mise en œuvre, je vous suggère de regarder des exemples en direct comme nopCommerce qui est une solution de commerce électronique open source. http://www.nopcommerce.com

(Celui-ci est très utile car il a mis en œuvre un fournisseur d'adhésion personnalisé qui utilise les idées de sel et hash)

Comment puis-je hacher une string en utilisant C #?

Jetez un oeil ici: http://support.microsoft.com/kb/307020

Quel serait le type de déclaration de champ dans MSSQL? nvarchar (64)?

Ce sont des données binarys. Vous voudrez peut-être le formater en tant que string, mais c'est "travail supplémentaire"

Qu'est-ce que le salage et dois-je l'save quelque part dans ma database?

Vous devriez utiliser un sel unique par input. Le sel est là pour rendre impossible de savoir si 2 fois le même mot de passe a été utilisé. Habituellement, une lame est construite à partir de 2 composants … Un "secret partagé" (doit être résonably complexe, de sorte qu'il peut vaincre lists de search) et une partie unique (par exemple une valeur ID de l'user dans la DB ou autre chose. … Assurez-vous simplement que "shared" + "Unique" + Password est unique

Si j'ai l'intention de laisser les gens utiliser Facebook Connect, dois-je m'inquiéter de créer un hachage / sel?

Si vous pouvez utiliser une API tierce, vous ne devez pas vous soucier de hacher le salage. Tant que vous ne sauvegardez pas les passwords, vous n'avez pas besoin de hachage. Hashing est une fonction à sens unique, donc il n'y a pas de "bonne" façon (Hint: Rainbow tables) de rebuild le mot de passe d'origine. Si vous laissez Facebook gérer l'authentification, vous ne devrez pas vous inquiéter de toute cette plomberie de base, puisque vous ne stockez pas les passwords.

Le hachage est utilisé si vous voulez des informations si sûres, que même quelqu'un qui vole votre DB ne peut pas y accéder. BTW: Cela comprend vous-même … Il n'y a aucun moyen de recréer le mot de passe d'origine …