Можно ли использовать HMAC для передачи пароля?

Я пишу небольшое веб-приложение и не хочу передавать пароли для входа в открытый текст. Поскольку у меня нет доступного SSL, я написал систему одноразовых запросов, которая отправляет случайную строку с формой входа в систему, которая затем используется для хеширования пароля с помощью HMAC-SHA256 на стороне клиента. Я использую случайную строку запроса в качестве сообщения и пароль пользователя в качестве секретного ключа для HMAC.

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


person Steffen    schedule 04.09.2011    source источник
comment
Возможно, это лучший вопрос для security.stackexchange.com   -  person Lekensteyn    schedule 04.09.2011


Ответы (2)


Я не считаю это приемлемым решением.

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

Что он не может сделать, так это некоторые другие вещи, которые может делать SSL, например, защита от прослушивания путем шифрования канала и проверки подлинности сервера для конечного пользователя.

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

Проверка идентификатора сервера: Одна из наиболее важных частей, которую вам здесь не хватает, - это защита ваших пользователей от обманутых фишером. Имея действующий сертификат SSL, ваши пользователи не смогут проверить, является ли сайт вашим или самозванцем. Вы пытаетесь защитить себя, проверяя подлинность конечного пользователя, что прекрасно, но вы забываете защитить конечного пользователя.

Мне было бы любопытно узнать, почему у вас нет SSL. Я часто это слышу и считаю, что обычная причина в том, что кто-то не хочет платить 50 долларов за сертификат. Но сертификат того стоит, и в среде, где важна безопасность, действительно не должно быть никаких технических причин, по которым SSL был бы недоступен.

person Jason Dean    schedule 06.09.2011
comment
Что ж, я знаю, что не могу заменить SSL на это, и я не собирался этого делать. Мой вопрос просто в том, правильно ли я использую HMAC. Например, моя первая версия использовала пароль пользователя в качестве сообщения и строку запроса в качестве ключа (потому что я думал, что сообщение, которое я хочу отправить на сервер, является паролем пользователя). Но потом я заметил, что строка вызова не совсем секрет, поэтому поменял ее. Большинство подобных решений, с которыми я сталкивался, просто пишут HMAC(password, challenge), и я не был уверен, какое сообщение должно быть сообщением и какой ключ. - person Steffen; 07.09.2011
comment
Что касается SSL, у моего сервера только один IP-адрес, и этот уже используется SSL для другого сайта. На данный момент я не знаю ни одного хорошего решения для использования сертификатов для каждого домена, а не IP. SNI было бы неплохо, но он не работает с IE / XP, что по-прежнему очень распространено. Сертификаты UC были бы единственным известным мне решением, но они стоят намного больше 50 долларов, и даже это не идеально. - person Steffen; 07.09.2011
comment
По моему опыту, попросить хостинг-провайдера добавить IP-адрес - нетрудно. На моем выделенном сервере было 5, на моем VPS - 1, а добавление дополнительных IP-адресов стоило 1-2 доллара в месяц. - person Jason Dean; 07.09.2011

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

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

Тогда ваше решение лучше, чем отправка пароля в виде обычного текста, так как злоумышленник не сможет узнать пароль пользователя, но он все равно может выдать себя за пользователя.

person Gus    schedule 04.09.2011