Лучший способ хранить пароль в базе данных

Я работаю над проектом, который должен иметь аутентификацию (имя пользователя и пароль)

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

Я использую C# и подключаюсь к экспресс-серверу 2008 года. Может ли кто-нибудь предложить (используя как можно больше примеров), как лучше всего хранить данные такого типа?

PS Я открыт для идеи, что эта информация не будет храниться в базе данных, если есть веская причина.

8 ответов

Решение

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

Итак, хотя вы думаете об этом хорошо, и это хороший вопрос, на самом деле это дубликат этих вопросов (по крайней мере):

Чтобы прояснить немного подробнее о соли, опасность простого хеширования пароля и его сохранения заключается в том, что если нарушитель захватывает вашу базу данных, он все равно может использовать так называемые радужные таблицы, чтобы иметь возможность "расшифровывать" пароль (по крайней мере, те, которые отображаются в радужной таблице). Чтобы обойти это, разработчики добавляют соль к паролям, которая, если все сделано правильно, делает атаки типа "радуга" просто невозможными. Обратите внимание, что распространенным заблуждением является просто добавление одинаковой и длинной строки ко всем паролям; хотя это не так уж и плохо, лучше всего добавлять уникальные соли в каждый пароль. Прочитайте это для большего.

Фон Вы никогда... действительно... не должны знать пароль пользователя. Вы просто хотите убедиться, что входящий пользователь знает пароль для учетной записи.

Hash It: храните хэши паролей пользователей (одностороннее шифрование) с помощью сильной хэш-функции. Поиск "C# encrypt паролей" дает множество примеров.

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

Теперь хешированные пароли означают, что вы (и воры базы данных) не должны иметь возможность вернуть этот хеш обратно в исходный пароль.

Как это использовать: Но, вы говорите, как мне использовать этот пароль, который хранится в базе данных?

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

Итак, сравните два хешированных пароля (хэш базы данных для имени пользователя и введенный и хешированный пароль). Вы можете сказать, "соответствовали ли они тому, что они ввели, тому, что исходный пользователь ввел для своего пароля", сравнив их хеши.

Дополнительный кредит:

Вопрос: Если бы у меня была ваша база данных, то не мог бы я просто взять взломщик, такой как Джон Потрошитель, и начать делать хэши, пока не найду совпадения с вашими хешированными паролями? (так как пользователи выбирают короткие словарные слова в любом случае... это должно быть легко)

Ответ: да... да, они могут.

Итак, вы должны "засолить" свои пароли. Смотрите статью в Википедии о соли

Смотрите пример "Как хэшировать данные с солью" на C#

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

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

Таким образом (практически) невозможно получить незашифрованный пароль.

Я бы настоятельно рекомендовал прочитать статьи " Достаточно с таблицами Rainbow": что нужно знать о безопасных схемах паролей [недействительная ссылка, копирование в интернет-архив] и как безопасно хранить пароль.

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

Я могу быть немного не в теме, так как вы упомянули о необходимости имени пользователя и пароля, и мое понимание проблемы, безусловно, не лучшее, но стоит ли задумываться об OpenID?

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

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

RPX предоставляет хороший простой способ интегрировать поддержку OpenID в приложение.

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

Все было построено для этих целей, проверьте членство asp.net

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

Другие вопросы по тегам