2014-07-18 4 views
0

Я получил DB AdventureWorks2012 от http://msftdbprodsamples.codeplex.com/releases/view/55330 и попытался проверить ValidatePassword из Person.Password. В описании столбца «PasswordHash» указано «Пароль для учетной записи электронной почты». и в описании столбца «PasswordSalt» указано «Случайное значение, связанное с строкой пароля до того, как пароль будет хэширован».AdventureWorks2012 DB - как был сохранен пароль и как проверен пароль?

Вот примеры данных из БД:

BusinessEntityID, PasswordHash, PasswordSalt, EmailAddress 
---------------- -------------------------------------------------------------------------- 
1, pbFwXWE99vobT6g+vPWFy93NtUU/orrIWafF01hccfM=, bE3XiWw=, [email protected] 

2, bawRVNrZQYQ05qF05Gz6VLilnviZmrqBReTTAGAudm0=, "EjJaC3U=, [email protected] 

Как знать, какой алгоритм хеширования используется для создания PasswordHash? И как был создан passwordsalt?

Вот пример попытки проверки пароля, но ни один из алгоритмов хэша не работает. Может ли кто-нибудь пролить свет на это?

public class SecurityService : ISecurityService 
    { 
     public string UserName { get; set; } 

     public bool ValidateCredentials(string password, Password dbPassword) 
     { 
      bool valid = false; 

      byte[] saltBytes = Convert.FromBase64String(dbPassword.PasswordSalt); //dbPassword.PasswordSalt: bE3XiWw= 
      byte[] passwordBytes = Encoding.Unicode.GetBytes(password); //password: [email protected] 
      byte[] passwordHashBytes = Convert.FromBase64String(dbPassword.PasswordHash);//dbPassword.PasswordHash: pbFwXWE99vobT6g+vPWFy93NtUU/orrIWafF01hccfM= 
      byte[] passwordHashed = Hash(passwordBytes, saltBytes); 
      byte[] dbPasswordHashed = Hash(passwordHashBytes, saltBytes); 

      valid = dbPasswordHashed.SequenceEqual(passwordHashed); 

      return valid; 

     } 

     private static byte[] Hash(byte[] value, byte[] salt) 
     { 
      byte[] saltedValue = value.Concat(salt).ToArray(); 
      return HashAlgorithm.Create("MD5").ComputeHash(saltedValue); 
      //return HashAlgorithm.Create("SHA1").ComputeHash(saltedValue); 
      //return HashAlgorithm.Create("SHA256").ComputeHash(saltedValue); 
      //return HashAlgorithm.Create("SHA384").ComputeHash(saltedValue); 
      //return HashAlgorithm.Create("SHA512").ComputeHash(saltedValue); 
     } 
    } 
+0

Вы уверены, что в этом примере пароль и значение из столбца адреса электронной почты совпадают? –

+0

Да, это описание столбца для столбца пароля. – user3851226

ответ

0

Если вы замените valid = dbPasswordHashed.SequenceEqual (passwordHashed); с valid = passwordHashBytes.SequenceEqual (passwordHashed);

он даст правильные результаты.