Найкращий спосіб зберігання пароля в базі даних [закрито]


474

Я працюю над проектом, який повинен мати автентифікацію (ім’я користувача та пароль)

Він також підключається до бази даних, тому я подумав, що я зберігатиму ім'я користувача та пароль там. Однак, здається, не дуже гарна ідея мати паролі, як просто текстове поле в таблиці, що знаходиться в базі даних.

Я використовую C # і підключаюся до сервера експресів 2008 року. Чи може хтось запропонувати (з якомога більше прикладів), який найкращий спосіб зберігати цей тип даних?

PS Я відкритий для думки, що ця інформація не зберігатиметься в базі даних, якщо можна надати вагомі причини


1
Що б ви не робили, якщо ви переходите до шифрування, не зберігайте ключ у коді як попередній згаданий плакат. Це просто погана практика.
Вуді

12
"Як правильно зробити паролі?" є життєво важливим питанням. Це складна проблема, і помилки мають серйозні наслідки (пригадайте, що сталося з Tesco та LinkedIn). Я думаю, що це питання слід знову відкрити на programmers.stackexchange.com
Полковник Паніка

2
Краще дотримуватися стандартів - дивіться en.wikipedia.org/wiki/PBKDF2 Ви повинні знайти реалізацію на своїй мові
Борис Треухов

5
На це питання широко відповіли на форумі з безпеки: security.stackexchange.com/questions/211/…
gioele

Відповіді:


405

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

Отже, хоча ви добре думаєте над цим питанням, і це гарне питання, це насправді дублікат цих питань (принаймні):

Щоб детальніше уточнити біт соління, небезпека просто хешувати пароль та зберігати те, що якщо порушник потрапить у вашу базу даних, вони все ще можуть використовувати те, що відомо, як таблиці веселки, щоб мати змогу "розшифрувати" пароль (принаймні ті, які відображаються у таблиці веселки). Щоб уникнути цього, розробники додають сіль до паролів, що при правильному виконанні атаки веселки просто неможливо зробити. Зауважте, що поширена помилка - просто додати однакову унікальну та довгу строку до всіх паролів; хоча це не жахливо , найкраще додавати унікальні солі до кожного пароля. Прочитайте це докладніше.


40
Я мав на увазі зберігання пароля в базі даних, а не зберігання його в іншому місці. Якщо винести це речення з контексту, то здається, що я підтримую збереження простих паролів, якщо ви читаєте решту, я, очевидно, не знаю.
Паоло Бергантіно,

14
Мало того, що я сказав, я направив його на безліч дописів, де обговорюються солі та таке інше ...
Паоло Бергантіно,

1
@Paolo Bergantino: ви впевнені, що у вашій посаді немає помилки на друку? У ньому написано: «У більшості випадків, з якими ви зіткнетесь (і я, чесно кажучи, не можу придумати жодних зустрічних прикладів) зберігання пароля в базі даних - це належна річ». ??? Здається, це підтверджує ваші коментарі
Mitch Wheat

3
Те, що сказав Паоло, прямо суперечить самому собі. Солоний хеш пароля - це не пароль. Зберігання засоленого хеша пароля в базі даних не зберігає пароль у базі даних. Основа відповіді цілком доречна, але її перше речення є вкрай оманливим.
Роберт Россні

40
@Robert: Це стає небезпечно близьким до гри в дрібну семантику, але я все-таки виправлю це ...
Паоло Бергантіно,

54

Передумови Ви ніколи ... дійсно ... не повинні знати пароль користувача. Ви просто хочете переконатися, що вхідний користувач знає пароль для облікового запису.

Hash It: Зберігайте хешовані паролі користувачів (одностороннє шифрування) за допомогою сильної хеш-функції. Пошук "паролів шифрування c #" дає безліч прикладів.

Дивіться в Інтернеті SHA1-хеш-творця, щоб дізнатись про те, що виробляє хеш-функція (Але не використовуйте SHA1 як хеш-функцію, використовуйте щось сильніше, наприклад, SHA256).

Тепер хешовані паролі означають, що ви (і злодії бази даних) не повинні мати змогу повернути цей хеш у вихідний пароль.

Як ним користуватися: Але, скажете, як я можу використовувати цей пюре, збережений у базі даних?

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

Отже, порівняйте два хешовані паролі (хеш бази даних для імені користувача та введений і хешований пароль). Ви можете сказати, чи "те, що вони ввели", збігалося з тим, що ввів початковий користувач для свого пароля ", порівнюючи їх хеши.

Додатковий кредит:

Питання: Якби я мав вашу базу даних, то чи не міг би я просто взяти зломщик, як Джон Розпушувач, і почати робити хеші, поки не знайду збіги з вашими збереженими, хешированими паролями? (оскільки користувачі в будь-якому випадку вибирають короткі, словникові слова ... це повинно бути легко)

Відповідь: Так ... так, вони можуть.

Отже, вам слід «посолити» ваші паролі. Дивіться статтю Вікіпедії про сіль

Див. Приклад C # "Як хеш-дані з сіллю"


14
Хороший пост, за винятком одного: md5 та sha1 були зламані. Напевно, ви повинні піти з більш сильним алгоритмом, наприклад, сімейством SHA2.
Паоло Бергантіно

3
Спасибі Паоло - ти прав. Оскільки використання SHA2 так само просто, як і використання MD5 & SHA1, будь ласка, використовуйте більш сильний алгоритм хешування.
joej

5
SHA-1 не зламаний. Але парафазувати Брюса Шнайєра: Ходіть, не біжіть, до SHA-2.
Ян Бойд

2
"Отже, вам слід" посолити "свої паролі" ... Але сіль зазвичай зберігається в базі даних разом із паролем, і як це допомагає? Нападник просто повинен додати сіль до словникових фраз-атак, на які він тестує. Як це безпечніше, окрім того, що він не виявить повторюваних паролів?
trusktr

4
@joej "Вам ніколи ... дійсно ... потрібно знати пароль користувача" - це дуже короткоглядне припущення. Існує багато видів програм, де зберігання пароля таким чином, який можна отримати, справді необхідне. Наприклад, додаток, якому потрібно часто входити в іншу систему зі збереженими обліковими записами, що постачаються та оновлюються користувачем.
Франциско Зарабобозо

29

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


6
На мою думку, завжди потрібно використовувати повільні алгоритми (наприклад, Blowfish) для зберігання паролів. Ця реєстрація набагато краща відповідь: security.stackexchange.com/questions/211/… . Просто розміщуючи його тут, оскільки ця сторінка все ще виявляється високо в результатах пошуку.
Дином

2
Дотримуючись цієї поради щодо зберігання паролів, це було б страшенно неправильно.
mlissner

27

Найкраща практика безпеки - це не зберігати пароль взагалі (навіть не зашифровано), а зберігати солоний хеш (з унікальною сіллю на пароль) зашифрованого пароля.

Таким чином, неможливо отримати пароль простого тексту.


11
Уейн, засолюючи перед обчисленням хеш, таблицю веселки ефективно перемагають за умови, що сіль має достатній розмір.
Майк Розенблум

11
@Wayne Hartman: Не так. Якщо значення солі виставлено, ви повинні створити нову таблицю веселки для цього конкретного значення солі. Точкою таблиці веселки є попередньо обчислені хеш-значення. І ніхто не матиме веселкового столу за його специфічною сіллю.
Ян Бойд

10

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

Багато кодерів, включаючи мене, думаю, що вони розуміють безпеку та хеширование. На жаль, більшість із нас просто цього не робить.


1
@Johan Схоже, посилання зараз зламана, що прикро. Ось альтернатива codahale.com/how-to-safely-store-a-password
zebrabox

6

Я, можливо, трохи не тематичний, оскільки ви згадали про необхідність імені користувача та пароля, і моє розуміння проблеми визнано не найкращим, але чи варто OpenID щось розглянути?

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

Це може бути непридатним, якщо мова йде лише про внутрішнє використання

RPX забезпечує приємний простий спосіб інтегрувати підтримку OpenID в додаток.


Я погоджуюся з тим, що люди з відкритих порід openID стикаються, але для цього додатка це база даних для дому для компанії, я сумніваюся, що вони хотіли б, щоб будь-який старий, хто заходить, увійшов у систему. Також не потрібен доступ до Інтернету, щоб ця програма працювала правильно, тому мені б не хотілося цього вимагати.
Crash893

3

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

Для цього створено все, перевірте членство на asp.net


1

Я б сказав MD5 / SHA1 пароль, якщо вам не потрібно мати змогу повернути хеш. Коли користувачі входять, ви можете просто зашифрувати вказаний пароль і порівняти його з хешем. У цьому випадку зіткнення хешу майже неможливо, якщо хтось не отримає доступ до бази даних і не побачить хеш, для якого вже зіткнення.


2
Я б не використовував MD5 для хешування - це в основному зламана mscs.dal.ca/~selinger/md5collision
zebrabox

3
Насправді це не так зламано. Що вони можуть зробити, це знайти одне і те ж хеш-значення для двох різних файлів. Що вони не можуть зробити - це повернути MD5 та отримати робочий пароль.
waiwai933

2
Ну, чи не було б це теж порушено? Ви просто введіть інший пароль, який генерує той самий хеш, і ви перебуваєте. Не потрібно знати оригінальний пароль. Спосіб це можна виправити, якщо ви солите пароль перед хешированием.
mjuarez

2
@mjuarez, якщо ви додасте сіль до пароля для використання MD5, зіткнення не має значення, тому що ви не можете використовувати інший пароль
WiiMaxx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.