Подводные камни шифрования (с солью) md5-hashed-пароля (php) - PullRequest
1 голос
/ 30 августа 2010

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

Существуют ли подводные камни или более или менее очевидные опасности при этом[я имею в виду sha1 (md5 (пароль) с солью)]?

Спасибо за ваше время

Ответы [ 3 ]

3 голосов
/ 30 августа 2010

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

При проверке пароля, если поле newPass имеет значение null, используйте поиск старого пароля, но призывайте пользователей выполнить сброс пароля после проверки подлинности.

Изменение текущей (старой) схемы паролей для хеширования (perUserSalt + существующийPassWordHash) должно работать нормально.

2 голосов
/ 30 августа 2010

, если вы планируете использовать sha1(md5(password).$salt), все в порядке.
Вы можете использовать эту систему еще дальше.Нет необходимости предпринимать какие-либо специальные действия, когда пользователь меняет пароль.Просто зашифруйте его так же: sha1(md5(new password).$salt)

1 голос
/ 30 августа 2010

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

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

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

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

...