Где хранить пароль salt и как его получить

Я отвечаю за аутентификацию в нашем веб-приложении .Net MVC 4, и я ударил удар относительно хэширования паролей, хранения и аутентификации.

план в настоящее время использовать 2 соли, 1 динамический (на пользователя) и 1 статический (Константа веб-приложения) и сильную функцию хеширования.

учитывая простую пользовательскую таблицу, содержащую имя пользователя и пароль:

  • хранить Ли Соль для каждого пользователя в столбце таблицы пользователей?

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

Я слишком беспокоюсь? Есть ли альтернатива соли "для каждого пользователя", где я все еще могу сделать одношаговую аутентификацию?

2 ответов


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

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

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


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