2017-04-06 1 views
-1

Nous étudions certaines options/scénarios dans lesquels les informations d'identification de deux sources distinctes (application Pyhton Django et application ASP.NET) peuvent être migrées vers un seul magasin de données. Il y a plusieurs façons de migrer, dont l'une est la suivante: copier tous les hash de mot de passe dans un seul magasin et, en fonction d'une propriété supplémentaire, choisir la méthode de validation. Maintenant, je suis en train d'essayer de valider un hash de mot de passe généré en Python Django dans une application console C#.Quel est l'équivalent de l'utilisation de Python pbkdf2 en C# pour la migration des hachages de mots de passe

J'ai trouvé certaines ressources comme: https://docs.djangoproject.com/en/1.10/_modules/django/contrib/auth/hashers/

et

https://docs.djangoproject.com/en/1.10/_modules/django/contrib/auth/hashers/pbkdf2

mais j'ai des difficultés à traduire la logique C#. Je pense surtout parce que mes compétences en cryptographie ne sont pas suffisantes.

J'espère que quelqu'un peut me diriger dans la bonne direction à ce sujet.

Mise à jour 1:

Je teste avec suivant hash Django Python:

pbkdf2_sha256$20000$T4FXlMzy8zRE$X0hjGqgGYAOmBQSFoOBf/8nMLzGsK6STt8kE3meg6bM= 

public bool VerifyPassword(string password, string hashedPassword, string salt) 
{ 
    // Password: <test phrase> 
    // HashedPassword: X0hjGqgGYAOmBQSFoOBf/8nMLzGsK6STt8kE3meg6bM= 
    // salt: T4FXlMzy8zRE 

    int iterationCount = 20000; 

    byte[] src = Convert.FromBase64String(hashedPassword); 

    byte[] inputPwHash; 
    using (var bytes = new Rfc2898DeriveBytes(password, salt, iterationCount)) 
    { 
     inputPwHash = bytes.GetBytes(32); 
    } 

    var result = SlowEquals(src, inputPwHash); 
    return result; 
} 

Ce que j'ai essayé crée une implémentation pbkdf2 personnalisée avec un HMACSHA256 condensé.

public class Rfc2898DeriveBytes : DeriveBytes, IDisposable 
{ 
    public Rfc2898DeriveBytes(Byte[] password, Byte[] salt, Int32 iterations) 
    { 
     _hmacsha256Obj = new HMACSHA256(password); 
     hLen = _hmacsha256Obj.HashSize/8; 
     _passwordBytes = password; 
     _saltBytes = salt; 
     _iterationCount = iterations; 
    } 
} 

Je vais correspondre la hashresult de la façon suivante:

public bool VerifyPassword(string password, string hashedPassword, string salt) 
    { 
     int iterationCount = 20000; 

     byte[] src = Convert.FromBase64String(hashedPassword); 

     byte[] inputPwHash; 
     using (var bytes = new Rfc2898DeriveBytes(password, salt, iterationCount)) 
     { 
      inputPwHash = bytes.GetBytes(32); 
     } 

     var result = SlowEquals(src, inputPwHash); 
     return result; 
    } 

Mais les résultats de hachage ne sont pas les mêmes. Ai-je besoin de faire quelque chose avec l'encodage de texte?

Répondre