Intereting Posts
Пароль SQL Server 2008, заканчивающийся точкой с запятой Проблема Hibernate HQL, ожидающая, что IDENT обнаружит «*», (My) SQL полное соединение с тремя таблицами Использует ли параметризованный SqlCommand мою программу невосприимчив к SQL-инъекции? Каков наилучший способ скопировать подмножество строк таблицы из одной базы данных в другую в Postgres? Внутреннее соединение против Где sql jdbc getgeneratedkeys возвращает столбец «id» не найден, тип столбца неизвестен Обновление между двумя базами данных с использованием dblink не работает C # безопасно построить строку SQL для выполнения с использованием Entity Framework как группировать и подсчитывать с помощью MySQL Решение о создании индекса в столбце таблицы в базе данных? Как получить следующую / предыдущую запись в MySQL? SQL запятая разделил столбец => на строки, а затем суммарные суммы? Есть ли разница между GROUP BY и DISTINCT Как выбрать подстроку в Oracle SQL до определенного символа?

DB AdventureWorks2012 – как был сохранен пароль и как проверен пароль?

Я получил DB 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? И как был создан 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: 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); } } 

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

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