Обычный способ хранения пароля - использовать хэш-функцию для пароля, но до salt заблаговременно. Важно «солить» пароль, защищаться от атак rainbow table.
Так что ваш стол должен выглядеть примерно так, что
._______._________________.______________.
|user_id|hash |salt |
|-------|-----------------|--------------|
|12 |[email protected]|13%!#tQ!#3t...|
| |... |... |
При проверке, если данный пароль совпадает с пользователем, вы должны сцепить соль для данного пароля, а также вычислить хэш-функцию от строки результата. Если выход хэш-функции соответствует столбцу hash
- это правильный пароль.
Важно понимать, что идея соли-хеши имеет конкретную причину - запретить любому человеку, имеющему доступ к базе данных, знать какой-либо пароль (считается сложной проблемой для изменения вывода хэш-функции). Так, например, администратор базы данных банка не сможет войти на ваш банковский счет, даже если у него есть доступ ко всем столбцам.
Вы также должны использовать его, если считаете, что ваши пользователи будут использовать секретный пароль (например, пароль для своей учетной записи gmail) в качестве пароля вашего веб-сайта.
ИМХО это не всегда функция безопасности, которая необходима. Поэтому вы должны подумать, хотите ли вы этого.
См. this article за хорошее резюме этого механизма.
Update: Стоит отметить, что для дополнительной защиты от целенаправленной атаки для реверсирования хэша индивидуального пароля, вы должны use bcrypt, который может быть сколь угодно сложно вычислить. (Но если вы действительно не боитесь таинственного человека в черном, нацеленного на вашу конкретную базу данных, я думаю, что sha1 достаточно хорош. Я бы не представил другую зависимость для моего проекта для этой дополнительной безопасности. Тем не менее, нет причин не использовать sha1 100 раз, что дало бы аналогичный эффект).
Если это домен AD, вы не могли бы позволить аутентификации AD? – Rytmis
Спасибо всем за предложения. Richard – Richard