Я работаю над аутентификацией пользователя для веб-сайта.
Прочитав книгу Innocent Code, я последовал ее совету для хранения паролей в виде хэша (имя пользователя + пароль + соль). Теория заключается в том, что хеширование пароля само по себе небезопасно (подвержено атакам по словарю / радужной таблице и, возможно, не является уникальным хешем на любом сайте, если несколько пользователей используют один и тот же пароль). Хэширование имени пользователя и пароля вместе должно быть уникальным на любом сайте, но пользователи могут повторять эти же учетные данные на разных сайтах, поэтому, если он будет взломан на одном, он может быть взломан на многих сайтах. Поэтому использование хэша имени пользователя, пароля и значения соли для конкретного сайта должно создать глобально уникальный хеш (с учетом ограничений самого алгоритма хеширования)
В настоящее время у меня есть две таблицы в базе данных: пользователи и пароли.
Таблица пользователей хранит имя пользователя и соответствующую информацию об этом пользователе (разрешения, предпочтения и т. Д.), Но не содержит пароль.
Таблица паролей - это таблица из одного столбца, в которой хранится хэш пароля, как описано выше. Хеш - это его собственный первичный ключ в этой таблице. Я сделал предположение, что хэши должны быть достаточно уникальными, чтобы у меня никогда не было дубликатов хешей и, следовательно, дублирующих ключей (пожалуйста, исправьте меня, если я ошибаюсь в этом предположении.) Аутентификация выполняется путем воссоздания хэша от имени пользователя и пароля, предоставленных пользователем (плюс секретная соль) и проверки, существует ли этот хэш в БД. Если он там, они аутентифицируются.
Пока все работает хорошо.
При использовании этой схемы не должно быть способа связать хэш пароля с каким-либо конкретным пользователем. Знание идентификатора пользователя не поможет никому найти соответствующий хэш пароля.
Я не уверен, как я придумал эту схему. Я думал, что прочту это в книге «Код невинных кодов», но я просто прочитал это снова, и дело доходит до хеширования паролей солью. Похоже, он не предлагает выделять пароли из пользовательской таблицы.
Теперь моя проблема в том, что если мне когда-либо придется удалить пользователя из системы, у меня нет возможности узнать, какой пароль был связан с этой учетной записью, поэтому я не могу удалить любые пароли. В будущем я смогу увидеть, что в таблице паролей появятся бесхозные хэши паролей.
Итак, мой вопрос: как мне с этим бороться?
Я параноик, храня пароли отдельно от таблицы пользователей? Создание большей проблемы для себя, чем я решаю? Неужели было бы больно помещать хешированные пароли в таблицу пользователей? Было бы лучше иметь единую таблицу со всей пользовательской информацией?