2010-03-19 6 views
3

Я принимаю систему, которую написал предыдущий разработчик. Система имеет администратор, одобряющий учетную запись пользователя, и когда они делают это, система использует следующий метод для хеширования пароля и сохранения его в базе данных. Он отправляет неуправляемый пароль пользователю. Когда пользователь регистрируется в системе, использует тот же самый метод для хэша, который вводит пользователь и сравнивает его с значением базы данных. Мы запустили пару раз, когда запись в базе данных не соответствует входной сыворотке пользователя, которую они должны. Таким образом, кажется, что метод не всегда хэширует значение одно и то же. Кто-нибудь знает, не является ли этот метод хеширования надежным и как сделать его надежным? Благодарю.пароль хеширования, дающий разные результаты

private string HashPassword(string password) 
    { 
     string hashedPassword = string.Empty; 

     // Convert plain text into a byte array. 
     byte[] plainTextBytes = Encoding.UTF8.GetBytes(password); 

     // Allocate array, which will hold plain text and salt. 
     byte[] plainTextWithSaltBytes = 
       new byte[plainTextBytes.Length + SALT.Length]; 

     // Copy plain text bytes into resulting array. 
     for(int i = 0; i < plainTextBytes.Length; i++) 
      plainTextWithSaltBytes[i] = plainTextBytes[i]; 

     // Append salt bytes to the resulting array. 
     for(int i = 0; i < SALT.Length; i++) 
      plainTextWithSaltBytes[plainTextBytes.Length + i] = SALT[i]; 

     // Because we support multiple hashing algorithms, we must define 
     // hash object as a common (abstract) base class. We will specify the 
     // actual hashing algorithm class later during object creation. 
     HashAlgorithm hash = new SHA256Managed(); 

     // Compute hash value of our plain text with appended salt. 
     byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes); 

     // Create array which will hold hash and original salt bytes. 
     byte[] hashWithSaltBytes = new byte[hashBytes.Length + 
              SALT.Length]; 
     // Copy hash bytes into resulting array. 
     for(int i = 0; i < hashBytes.Length; i++) 
      hashWithSaltBytes[i] = hashBytes[i]; 

     // Append salt bytes to the result. 
     for(int i = 0; i < SALT.Length; i++) 
      hashWithSaltBytes[hashBytes.Length + i] = SALT[i]; 

     // Convert result into a base64-encoded string. 
     hashedPassword = Convert.ToBase64String(hashWithSaltBytes); 

     return hashedPassword; 
    } 

ответ

1

Если процедура не использует случайного принятия решений (то есть, она является полностью детерминированной), и реализации используемых алгоритмов являются одинаковыми (и они должны быть - SHA256 должен действовать точно то же самое, и то же самое относится к строкам Base64), то маловероятно, что сам алгоритм «не хеширует значение одно и то же».

Если вы не можете воспроизвести ошибку (значение: найти какое-то значение, которое всегда генерирует один хэш при хэшировании на сервере, а другое - при хэшировании клиентом), вы должны убедиться, что значения переданы и получены правильно. Может быть, клиент получил несанкционированный пароль? Может быть, сервер получает поврежденные данные от клиента? возможно, данные в самой базе данных сервера каким-то образом изменились? Убедитесь, что каждая транзакция проверена, то есть пользователь не может получить поврежденный пароль.

4

Эта функция делает хеширование с солью. Это технический метод, чтобы сделать различными хешем для того же пароля и сделать поиск таблицы намного сложнее.

Хеш тот же только если у вас есть такое же значение соли.

см. Wikipedia http://en.wikipedia.org/wiki/Salt_%28cryptography%29 подробно об этой технике.

Цитирование http://msdn.microsoft.com/en-us/magazine/cc164107.aspx:

Чтобы замедлить атаку, использовать соль. Соль - это способ опроса паролей , прежде чем хэшировать их, сделав предварительно вычисленный словарь злоумышленника бесполезным. Вот как это делается. Всякий раз, когда вы добавляете запись в базу данных , вы вычисляете случайную строку цифр , которые будут использоваться в качестве соли. Если вы хотите рассчитать хэш Пароль Алисы, вы посмотрите на соль значение для учетной записи Алисы, добавьте ее к паролю, а хэш их вместе. Полученная база данных выглядит так:

<users> 
    <user name='Alice' salt='Tu72*&' password='6DB80AE7...'/> 
    <user name='Bob' salt='N5sb#X' password='096B1085...'/> 
    <user name='Fred' salt='q-V3bi' password='9118812E...'/> 
</users> 

Обратите внимание, что в настоящее время не существует никакого способа сказать , что Боб и Фред используете один и тот же пароль. Обратите внимание, что сама соль не является секретом.

Смежные вопросы