Как я могу использовать соление + хеширование в моем приложении ASP.Net? - PullRequest
2 голосов
/ 10 декабря 2010

Я строю проект с нуля, и я хочу делать все правильно.Я читал в Интернете о хэшах, и это в основном превращает пароль в 64 буквы mumbo jumbo, правильно?

А как насчет соления?

Мои вопросы:

  1. Как мне хэшировать строку с использованием C #?
  2. Каким будет тип объявления поля в MSSQL?nvarchar (64)?
  3. Что такое соление и нужно ли его сохранять где-нибудь в моей базе данных?
  4. Если я собираюсь позволить людям использовать Facebook Connect, нужно ли мне беспокоиться о созданиихэш / соль?

Примеры кода являются предпочтительными.Спасибо!

Ответы [ 4 ]

1 голос
/ 10 декабря 2010

1) Код

   public static string HashStringSha1(string plainText, string salt)
        {
            using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
            {
                byte[] bb = sha1.ComputeHash(Encoding.UTF8.GetBytes(salt + plainText + plainText));
                return Convert.ToBase64String(bb);
            }
        }

2) Сохранение строки base64 в SQLserver varchar

3) Сохранять соль в другом поле с помощью хэша.Соль в виде простого текста.

4) Не уверен, что вы имеете в виду.Если вы используете OpenId, вам не нужно хранить пароли.

1 голос
/ 10 декабря 2010

Я пропущу вопрос 1, так как я не человек C #.

Вопрос 3:

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

Важно создать новую соль для каждого пароля.

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

Псевдокод для генерации и проверки пароля:

generatePassword(String user, String password) {
    String salt = generateRandomSalt();
    String salted = salt + password;
    String hash = hexEncode(hash(salted));
    store(user, hash, salt);
}

checkPassword(String user, String testPassword) {
    String salt = lookupSalt(user);
    String salted = salt + testPassword;
    String testHash = hexEncode(hash(salted));
    return testHash.equals(lookupHash(user));
}

Вопрос 2:

Длина поля базы данных зависит от алгоритма хеширования. SHA1 генерирует 160-битный вывод, поэтому в шестнадцатеричном коде будет 40 символов. Хорошее практическое правило - использовать соль, размер которой совпадает с размером вывода хэша, поэтому у вас будет два 40-символьных столбца: один для соли и один для хеша.

Вопрос 4:

Понятия не имею, как работает Facebook Connect, извините. Я надеюсь, что другие два ответа полезны.

0 голосов
/ 10 декабря 2010

Как мне хэшировать строку, используя C #?

Взгляните сюда: http://support.microsoft.com/kb/307020

Каким будет тип объявления поля в MSSQL? NVARCHAR (64)?

Это двоичные данные. Возможно, вы захотите отформатировать его как строку, но это «дополнительная работа»

Что такое соление, и мне нужно сохранить это где-нибудь в моей базе данных?

Вы должны использовать уникальную соль для каждой записи. Соль в том, чтобы было невозможно узнать, использовался ли 2 раза один и тот же пароль. как правило, планка состоит из 2 компонентов ... «общего секрета» (должен быть достаточно сложным, чтобы обойти списки поиска) и уникальной части (например, значение идентификатора пользователя в БД или что-то еще) ... Просто убедитесь, что «общий» + «уникальный» + пароль уникален

Если я собираюсь позволить людям использовать Facebook Connect, нужно ли мне беспокоиться о создании хеша / соли?

Если вы можете использовать сторонний API, вам не нужно заботиться о хешировании. Пока вы не сохраняете пароли, нет необходимости хешировать. Хеширование является односторонней функцией, поэтому нет «хорошего» способа (Подсказка: Радужные таблицы) для восстановления исходного пароля. Если вы позволите Facebook обрабатывать аутентификацию, вам не придется беспокоиться обо всей этой базовой сантехнике, поскольку вы не храните пароли.

Хеширование используется, если вы хотите, чтобы некоторая информация была настолько защищенной, чтобы даже тот, кто украл вашу БД, не мог получить к ней доступ. КСТАТИ: Это включает в себя себя ... Нет способа восстановить исходный пароль ...

0 голосов
/ 10 декабря 2010

Хэш и соль используются для обеспечения безопасности вашего пароля пользователя.MD5-хэш - самый популярный используемый алгоритм.Хеш-функции необратимы -> вы не можете получить пароль из хеша, но кто-то где-то подумал - эй!Давайте сгенерируем таблицу, содержащую примеры паролей и их хешей, затем отсортируем их и выполним простой поиск для проверки пароля.Вот почему соль была введена - соль добавляется к паролю пользователя, а затем хэшируется.Соль генерируется случайным образом, поэтому ее следует хранить в БД для каждого хэша.

Для получения подробной информации о реализации я предлагаю вам взглянуть на примеры из реальной жизни, такие как nopCommerce, решение для электронной коммерции с открытым исходным кодом.http://www.nopcommerce.com

(это очень полезно, потому что в нем реализован пользовательский поставщик членства, который использует идеи соли и хэша)

...