2009-08-12 5 views
20

Comment l'appartenance ASP.NET génère-t-elle sa clé salt et ensuite comment l'encoder (c'est-à-dire, salt + password ou password + salt)? J'utilise SHA-1 avec mon abonnement, mais je voudrais recréer les mêmes sels de sorte que les trucs intégrés pour l'adhésion puissent hacher les choses de la même manière que mes affaires.sel d'adhésion ASP.NET?

Édition 2: Peu importe. Je l'ai mal lu et je pensais qu'il disait octets, pas bits. Je passais donc en 128 octets, pas en 128 bits.

Éditer: J'essayais de le faire ainsi. Voilà ce que j'ai, donc

public string EncodePassword(string password, string salt) 
{ 
    byte[] bytes = Encoding.Unicode.GetBytes(password); 
    byte[] src = Encoding.Unicode.GetBytes(salt); 
    byte[] dst = new byte[src.Length + bytes.Length]; 

    Buffer.BlockCopy(src, 0, dst, 0, src.Length); 
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); 

    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); 

    byte[] inArray = algorithm.ComputeHash(dst); 

    return Convert.ToBase64String(inArray); 
} 

private byte[] createSalt(byte[] saltSize) 
{ 
    byte[] saltBytes = saltSize; 

    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
    rng.GetNonZeroBytes(saltBytes); 

    return saltBytes; 
} 

Je n'ai pas essayé de voir si les membres ASP.NET reconnaîtra ce encore le mot de passe haché ressemble beaucoup. Je ne sais pas comment le convertir en base64 pour le sel.

Je l'ai fait

byte[] storeSalt = createSalt(new byte[128]); 
string salt = Encoding.Unicode.GetString(storeSalt); 
string base64Salt = Convert.ToBase64String(storeSalt); 

int test = base64Salt.Length; 

longueur de test est de 172 ce qui est bien au cours des 128 bits donc ce que je fais mal?

C'est ce que leur sel ressemble

vkNj4EvbEPbk1HHW+K8y/A== 

C'est ce que mon sel ressemble

E9oEtqo0livLke9+csUkf2AOLzFsOvhkB/NocSQm33aySyNOphplx9yH2bgsHoEeR/aw/pMe4SkeDvNVfnemoB4PDNRUB9drFhzXOW5jypF9NQmBZaJDvJ+uK3mPXsWkEcxANn9mdRzYCEYCaVhgAZ5oQRnnT721mbFKpfc4kpI= 
+0

Vous pouvez vérifier ma réponse sur cette SO page: http://stackoverflow.com/questions/530426/reimplement-asp-net-membership-and- user-password-hashing-in-ruby/8184569 # 8184569 –

Répondre

18

What is default hash algorithm that ASP.NET membership uses? a une bonne discussion de leur algorithme par défaut.

J'espère que cela aide!

Modifier- La réponse que je faisais référence est le code dans le poste haut,

public string EncodePassword(string pass, string salt) 
    { 
     byte[] bytes = Encoding.Unicode.GetBytes(pass); 
     //byte[] src = Encoding.Unicode.GetBytes(salt); Corrected 5/15/2013 
     byte[] src = Convert.FromBase64String(salt); 
     byte[] dst = new byte[src.Length + bytes.Length]; 
     Buffer.BlockCopy(src, 0, dst, 0, src.Length); 
     Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); 
     HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); 
     byte[] inArray = algorithm.ComputeHash(dst); 
     return Convert.ToBase64String(inArray); 
    } 

Ils combinent Unicode Sel + en utilisant BlockCopy

passe

- En réponse à votre question:

Les deux algorithmes sont nécessaires et remplissent différents rôles ...

RNG Crypto est utilisé pour générer le sel. C'est fondamentalement une longue chaîne de données aléatoires. Ceci est généré et stocké par utilisateur. Généralement, cela est fait lorsqu'un utilisateur est créé ou qu'un mot de passe est modifié. BlockCopy est juste la méthode qu'ils utilisent pour combiner le sel avec le mot de passe. Le code ci-dessus équivaut essentiellement à sel + mot de passe.

Vous ne serez pas en mesure de recréer une valeur de sel car elle est complètement aléatoire. Il est cependant stocké pour chaque utilisateur par le framework. Combiner le sel avec le mot de passe et le hacher en utilisant la technique ci-dessus vous permettra de vérifier les mots de passe des utilisateurs en utilisant la valeur hachée stockée par le framework.

Je pense que nous avons tous les deux lu votre question différemment.Le code que j'ai posté ne génèrera pas votre sel, mais il vous permettra de l'utiliser d'une manière compatible avec l'adhésion à ASP.NET.

Désolé, mon explication n'est pas la meilleure - est-ce que cela répond à votre question?

+0

Ne vous dit pas comment Microsoft fait le sel. –

+0

Le poste supérieur montre l'algorithme - Je l'ai copié ici pour plus de clarté. –

+0

Désolé, je vois ce que vous voulez dire. J'ai supposé qu'il cherchait comment il a été combiné pour recréer à partir de données existantes. –

1

Voici une façon de le faire. Un sel est juste un nombre aléatoire, vous pouvez utiliser la classe RNGCryptoServiceProvider dans la bibliothèque-cadre pour produire un bon nombre aléatoire à utiliser comme sel

private const int ITERATIONS = 10000; 
private const int SALT_SIZE = 32; 
private const int HASH_SIZE = 32; 

public void SaltAndHashPassword(string password, out byte[] salt, 
    out byte[] hash) 
{ 
    Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(
    password, 
    SALT_SIZE, 
    ITERATIONS); 

    salt = rdb.Salt; 
    hash = rdb.GetBytes(HASH_SIZE); 
} 
+0

Salut, je trouve sur msdn ce « PasswordSalt: valeur générée de façon aléatoire de 128 bits utilisé pour le mot de passe sel hachages, stockées sous forme codée en base 64 » http://msdn.microsoft.com/en-us/library /aa478949.aspx Alors, que ferais-je le salt_size à 128? que diriez-vous de la taille de hash? – chobo2

+0

ils ont aussi cette MembershipPasswordFormat.Hashed (la valeur par défaut), qui stocke les hachages salés générés à partir des mots de passe et des réponses de mot de passe. Le salt est une valeur aléatoire de 128 bits générée par la classe RNGCryptoServiceProvider du .NET Framework. Chaque paire mot de passe/mot de passe est salée avec cette valeur unique, et le sel est stocké dans le champ PasswordSalt de la table aspnet_Membership. Le résultat du hachage du mot de passe et du sel est stocké dans le champ Mot de passe. De même, le résultat du hachage de la réponse par mot de passe et du sel est stocké dans le champ PasswordAnswer. – chobo2

+0

me fait me demander si c'est Password + Salt. – chobo2

19

Voici comment le SqlMembershipProvider génère le sel.

private string GenerateSalt() { 
     var buf = new byte[16]; 
     (new RNGCryptoServiceProvider()).GetBytes(buf); 
     return Convert.ToBase64String(buf); 
    } 

Vous pouvez télécharger SQL fournisseur du code ASP.NET here.

Le problème que j'avais était une application de développement fonctionnant sur IIS7. .NET 4.0 utilisait un autre algorithme de hachage par défaut que le HashAlgorithmType par défaut pour .NET 2.0.

Dans l'exemple de code "EncodePassword" par Microsoft, ils référence Membership.HashAlgorithmType qui, selon moi, renvoie la valeur par défaut pour l'infrastructure, si elle n'est pas spécifiée dans le web.config.

J'ai réussi à faire fonctionner cette méthode GenerateSalt et EncodePassword pour mon application.

Mon code combiné:

internal string GenerateSalt() 
{ 
    byte[] buf = new byte[16]; 
    (new RNGCryptoServiceProvider()).GetBytes(buf); 
    return Convert.ToBase64String(buf); 
} 

internal string EncodePassword(string pass, int passwordFormat, string salt) 
{ 
    if (passwordFormat == 0) // MembershipPasswordFormat.Clear 
     return pass; 

    byte[] bIn = Encoding.Unicode.GetBytes(pass); 
    byte[] bSalt = Convert.FromBase64String(salt); 
    byte[] bAll = new byte[bSalt.Length + bIn.Length]; 
    byte[] bRet = null; 

    Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length); 
    Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length); 
    if (passwordFormat == 1) 
    { // MembershipPasswordFormat.Hashed 
     HashAlgorithm s = HashAlgorithm.Create("SHA1"); 
     // Hardcoded "SHA1" instead of Membership.HashAlgorithmType 
     bRet = s.ComputeHash(bAll); 
    } 
    else 
    { 
     bRet = EncryptPassword(bAll); 
    } 
    return Convert.ToBase64String(bRet); 
} 
+3

RhinoDevX64, votre réponse était exactement ce que je cherchais! Merci beaucoup, vous avez terminé mon combat de plusieurs jours en essayant de comprendre comment comparer mes chaînes avec des informations de hachage/sel dans la base de données! –