Я работаю над проектом, который должен иметь аутентификацию (имя пользователя и пароль)
Он также подключается к базе данных, поэтому я решил сохранить там имя пользователя и пароль. Тем не менее, кажется, что не очень хорошая идея иметь пароли, а просто текстовое поле в таблице, расположенной в базе данных.
Я использую C # и подключаюсь к экспресс-серверу 2008 года. Может ли кто-нибудь предложить (используя как можно больше примеров), как лучше всего хранить данные такого типа?
PS Я открыт для идеи, что эта информация не будет храниться в базе данных, если есть веская причина.
Ответы:
Вы правы, что хранение пароля в текстовом поле - ужасная идея. Однако, что касается определения местоположения , для большинства случаев, с которыми вы столкнетесь (и я, честно говоря, не могу придумать никаких контрпримеров), хранение представления пароля в базе данных является правильным решением. По представлению Я имею в виду , что вы хотите хэш пароля с помощью соли (который должен быть различным для каждого пользователя) и безопасный алгоритм 1-полосного и магазин , что , выбрасывая первоначальный пароль. Затем, когда вы хотите проверить пароль, вы хэшируете значение (используя тот же алгоритм хэширования и соль) и сравниваете его с хешированным значением в базе данных.
Итак, хотя вы думаете об этом хорошо, и это хороший вопрос, на самом деле это дубликат этих вопросов (по крайней мере):
Чтобы пояснить чуть-чуть подробнее о соли, опасность простого хеширования пароля и его сохранения заключается в том, что если нарушитель захватит вашу базу данных, он все равно может использовать так называемые радужные таблицы, чтобы иметь возможность «расшифровывать» пароль (по крайней мере, те, которые отображаются в радужной таблице). Чтобы обойти это, разработчики добавляют соль к паролям, которая, если все сделано правильно, делает радужные атаки просто невозможными. Обратите внимание, что распространенным заблуждением является просто добавление одинаковой и длинной строки ко всем паролям; в то время как это не ужасно , то лучше всего, чтобы добавить уникальные соли для каждого пароля. Прочитайте это для большего.
источник
Фон Вы никогда ... действительно ... не должны знать пароль пользователя. Вы просто хотите убедиться, что входящий пользователь знает пароль для учетной записи.
Hash It: храните хэши паролей пользователей (одностороннее шифрование) с помощью надежной хэш-функции. Поиск "c # encrypt паролей" дает множество примеров.
Обратитесь к онлайн-создателю хеш-функции SHA1, чтобы узнать, что создает хеш-функция (но не используйте SHA1 в качестве хеш-функции, используйте что-то более сильное, например, SHA256).
Теперь хешированные пароли означают, что вы (и воры базы данных) не должны иметь возможность вернуть этот хеш обратно в исходный пароль.
Как это использовать: Но, вы говорите, как мне использовать этот пароль, хранящийся в базе данных?
Когда пользователь входит в систему, он выдаст вам имя пользователя и пароль (в исходном тексте). Вы просто используете тот же хеш-код для хеширования введенного пароля, чтобы получить сохраненную версию.
Итак, сравните два хешированных пароля (хэш базы данных для имени пользователя и введенный и хешированный пароль). Вы можете сказать, «соответствовали ли они тому, что они ввели, тому, что исходный пользователь ввел для своего пароля», сравнив их хеши.
Дополнительный кредит:
Вопрос: Если бы у меня была ваша база данных, то не мог бы я просто взять взломщик, такой как Джон Потрошитель, и начать делать хэши, пока не найду совпадения с вашими хешированными паролями? (так как пользователи выбирают короткие словарные слова в любом случае ... это должно быть легко)
Ответ: да ... да, они могут.
Итак, вы должны «засолить» свои пароли. Смотрите статью в Википедии о соли
Смотрите "Как хэшировать данные с солью" C # пример
источник
В качестве закаленного ключа хеш-кода с использованием безопасного алгоритма, такого как sha-512.
источник
Лучшая практика безопасности - не хранить пароль вообще (даже не зашифрованный), а хранить соленый хеш (с уникальной солью на пароль) зашифрованного пароля.
Таким образом (практически) невозможно получить незашифрованный пароль.
источник
Я бы настоятельно рекомендовал прочитать статьи « Достаточно с таблицами Rainbow»: что нужно знать о безопасных схемах паролей [неработающая ссылка, копия в Интернет-архиве ] и как безопасно хранить пароль .
Многие кодеры, включая меня, думают, что они понимают безопасность и хеширование. К сожалению, большинство из нас просто нет.
источник
Я могу быть немного не по теме, так как вы упомянули о необходимости имени пользователя и пароля, и мое понимание проблемы, безусловно, не лучшее, но стоит ли задумываться об OpenID?
Если вы используете OpenID, то вы вообще не сохраняете никаких учетных данных, если я правильно понимаю технологию и пользователи могут использовать учетные данные, которые у них уже есть, избегая необходимости создавать новую идентификацию, специфичную для вашего приложения.
Это может не подойти, если рассматриваемое приложение предназначено исключительно для внутреннего использования.
RPX предоставляет хороший простой способ интегрировать поддержку OpenID в приложение.
источник
В вашем сценарии вы можете взглянуть на членство в asp.net, рекомендуется хранить пароль пользователя в виде хешированной строки в базе данных. Вы можете аутентифицировать пользователя, сравнивая хешированный входящий пароль с тем, который хранится в базе данных.
Все было построено для этих целей, проверьте членство asp.net
источник
Я бы MD5 / SHA1 пароль, если вам не нужно иметь возможность отменить хэш. Когда пользователь входит в систему, вы можете просто зашифровать указанный пароль и сравнить его с хешем. В этом случае хеш-коллизии практически невозможны, если только кто-то не получит доступ к базе данных и не увидит хеш, для которого у него уже есть коллизия.
источник