2008-11-23 5 views
3

Dans un effort continu pour améliorer mon code, je cherche le meilleur moyen de créer et de comparer un mot de passe salé dans .NET.Quelle est la manière la plus simple de créer et de comparer un mot de passe salé dans .NET?

Y a-t-il une meilleure façon, ou plus sûre, de faire cela?

Mon code actuel est le suivant:

public static string CreateSaltedPassword(string salt, string password) 
    { 
     SHA1CryptoServiceProvider SHA1 = null; 

     SHA1 = new SHA1CryptoServiceProvider(); 

     // Convert the string into an array of bytes 
     byte[] byteValue = System.Text.Encoding.UTF8.GetBytes(salt + password); 

     // Compute the hash value 
     byte[] byteHash = SHA1.ComputeHash(byteValue); 

     // Dispose the unmanaged cryptographic object 
     SHA1.Clear(); 

     return Convert.ToBase64String(byteHash); 
    } 

    public static bool ComparePasswords(string salt, string password, string storedPassword) 
    { 
     string passwordHash = string.Empty; 

     // Create the hashed password 
     passwordHash = PasswordProvider.CreateSaltedPassword(
      salt, password); 

     // Compare the passwords 
     return (string.Compare(storedPassword, passwordHash) == 0); 
    } 

Répondre

13

La simple répétition d'une fonction de hachage n'est pas suffisante. Vous devez répéter, mais d'une manière qui préserve l'entropie présente dans le mot de passe. As suggested here, utilisez Rfc2898DeriveBytes pour une approche plus sécurisée.

Vous devriez faire plusieurs milliers d'itérations à travers le hachage. Faites quelques tests pour voir combien de temps il faut sur votre machine cible: 10000 itérations ou plus ne devraient pas être visibles aux utilisateurs lorsque vous vérifiez leur entrée, mais cela va changer le temps requis par l'attaquant de plusieurs heures à plusieurs années.

La source de sel et la taille ne sont pas montrées; le sel n'a pas besoin d'être secret, il doit simplement être imprévisible pour un mot de passe donné. 8 octets d'un RNG cryptographique est un sel pratique et sécurisé. Les noms d'utilisateur sont plus pratiques, mais peuvent être moins sécurisés. PBKDF2 offre une sécurité raisonnable pour la plupart des applications aujourd'hui.

La prochaine étape dans la sécurité serait bcrypt ou scrypt.

Vous pouvez être intéressé par mes réponses à ces questions similaires:

+0

Vous devriez probablement ajouter quelques informations sur chaque itération effectuée, car simplement répéter la fonction de hachage N fois augmente légèrement le risque de collision. Voir http://en.wikipedia.org/wiki/Key_strengthening#Hash_based_key_stretching – ollb

+0

Oui, il n'est pas suffisant d'itérer un hachage pour plusieurs raisons. Au minimum, PBKDF2 devrait être utilisé pour préserver l'entropie présente dans le mot de passe. – erickson

2

Jeff Atwood code project article:

Cette classe est fortement documenté, cordage , et surtout, simples! Il est idéal pour en savoir plus sur le cryptage .

5

Utilisez la classe Rfc2898DeriveBytes de System.Security.Cryptography.

Il est intégré au framework .NET depuis la version 2.0 et il implémente PBKDF2-HMACSHA1, ce qui donne un mot de passe solide et un ralentissement du hachage (ce qui est critique pour les hachages de mots de passe).

Questions connexes