БД AdventureWorks2012 - как хранился пароль и как проверялся пароль?

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

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

BusinessEntityID, PasswordHash, PasswordSalt, EmailAddress
---------------- --------------------------------------------------------------------------
1, pbFwXWE99vobT6g+vPWFy93NtUU/orrIWafF01hccfM=, bE3XiWw=, ken0@adventure-works.com

2, bawRVNrZQYQ05qF05Gz6VLilnviZmrqBReTTAGAudm0=, "EjJaC3U=, terri0@adventure-works.com

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

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

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: ken0@adventure-works.com
            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);  
        }
    }

1 ответ

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

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

Другие вопросы по тегам