Где хранить пароль salt и как его получить
Я отвечаю за аутентификацию в нашем веб-приложении .Net MVC 4, и я ударил удар относительно хэширования паролей, хранения и аутентификации.
план в настоящее время использовать 2 соли, 1 динамический (на пользователя) и 1 статический (Константа веб-приложения) и сильную функцию хеширования.
учитывая простую пользовательскую таблицу, содержащую имя пользователя и пароль:
- хранить Ли Соль для каждого пользователя в столбце таблицы пользователей?
мой беспокойство заключается в том, что при этом мне придется получить пользователя из базы данных в памяти веб-приложения только с его именем пользователя. Есть ли какая-то атака, где это может быть проблематично? В идеале я хотел бы, чтобы это была аутентификация одного шага/одного SQL-запроса.
Я слишком беспокоюсь? Есть ли альтернатива соли "для каждого пользователя", где я все еще могу сделать одношаговую аутентификацию?
2 ответов
соль может храниться вместе с хэшем пароля, поэтому вы можете создать соль на пароль вместо пользователя. Это обычная практика для хэш-функций пароля (медленная функция вывода ключей, такая как BCrypt или PBKDF2), чтобы вернуть солевой текст как часть хэша пароля, что означает, что вы можете хранить соль и хэш вместе в одном поле базы данных.
чтобы проверить введенный пароль, вам сначала нужно найти пароль-хэш (используя имя пользователя или email), а затем функция может извлечь используемую соль из сохраненного хэша пароля и использовать ее для сравнения хэшей. Это должно фактически ответить на ваш вопрос, базы данных обычно не имеют соответствующих функций для хэширования паролей, поэтому вы не можете выполнить проверку в SQL-запросе, проверка будет выполнена в коде.
вторая соль на самом деле называется перцем, лучший способ добавить этот секрет на стороне сервера, чтобы зашифровать уже хэшированный пароль с этим секретом. В отличие от хэша, это будет двухстороннее шифрование, что позволяет обменять ключ, если это когда-то будет необходимо.
для этого вам не нужна внешняя библиотека. Структура имеет свою собственную реализацию PBKDF2, встроенную. Я предпочитаю хранить соль в отдельном поле в базе данных, но это просто дело вкуса я думаю. Я написал свои мысли о хэшировании паролей здесь