Зашифрованный пароль в архиве базы данных и браузера

Я написал небольшой веб-сервер, который в настоящее время использует базовый auth over ssl. Пока все отлично работает. Теперь я хочу (нужно) переключиться на дайджест auth. Но я не могу понять, как сделать эту работу с паролями, которые не хранятся как открытые в базе данных? У меня есть только парольный дайджест (сгенерированный с помощью bcrypt) паролей моих пользователей. Возможно ли вообще аутентификация http digest?

Ответ 1

Просто смотрел в это только сейчас. Во-первых, я прочитал RFC 2617 - HTTP-аутентификация: аутентификация основного и дайджест-доступа, чтобы получить представление о спецификации и посмотреть, как ее можно адаптировать для аутентификации REST API.

Отвечайте на тот же вопрос, что и вы, - означает ли аутентификация дайджеста, что сервер должен хранить пароль пользователя в виде открытого текста?

В этом Ответ на переполнение стека дает понять: Нет. Сервер не хранит пароль открытого текста - он должен хранить хэш (username|realm|password).

Это было бы прекрасно, за исключением одного: каноническая спецификация поддерживает только MD5 как хеш-функцию.

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


Итак, я сделал шаг назад и подумал: почему бы не игнорировать спецификацию и использовать bcrypt с обеих сторон как хеш-функцию (bcrypt(username|realm|password))?

Ну, кроме того, чтобы быть целенаправленно медленным, bcrypt имеет максимальную длину пароля, которая делает его непригодным для использования в качестве общего алгоритм дайджеста.


Ух, теперь моя голова плавала, но я все еще думал, чтобы он снова пошел. Некоторые из предложений заключались в использовании TLS с SRP или аутентифицированным шифрованием, в частности EAX, но я чувствовал, что, возможно, это делали вещи слишком далеко за простой веб-сервис.

Проще говоря, если вы действительно намереваетесь сделать это, вы можете работать с ограничением символов bcrypt, используя предварительный хэш.


Короче говоря, вы можете сделать:

bcrypt(sha256(username|realm|password))

И используйте это вместо H(A1) в бастардированной версии спецификации.

Теперь возникает вопрос - была ли вообще такая сложная сложность? Получили ли мы дополнительный уровень безопасности по сравнению с Basic auth over HTTPS?