Проблема в том, что одноразовый номер + хэш можно воспроизвести. Настоящий протокол аутентификации требует как минимум двух сообщений:
Server Client
---->challenge --->
<----response------
Например, вызовом может быть одноразовый номер, предоставленный сервером, а ответом клиента может быть хэш пароля с одноразовым номером.
К сожалению, для этого требуется состояние, и вся проблема протоколов RESTful заключается в том, что им не нужны проблемы с сохранением состояния. И все же они хотят подтвердить подлинность...
Итак, у вас действительно есть три варианта:
Вариант 1. Притворитесь, что проблемы не существует, и используйте протокол «аутентификации» без сохранения состояния. Это ничем не отличается от использования файла cookie. Nonce + пароль-хэш не более безопасен, чем файл cookie. Файлы cookie могут быть украдены и т. д. и воспроизведены. Вся сеть теперь страдает от этих повторных атак.
Вариант 2. Попробуйте прикрутить протокол аутентификации к методу связи без сохранения состояния. Здесь вы бы попросили клиента отправить вам временную метку UTC вместо одноразового номера. Использование метки времени обеспечивает ограниченную защиту от воспроизведения. Очевидно, что ваши часы не будут синхронизированы с часами клиента, поэтому ваш сервер будет разрешать любую отметку времени в пределах некоторой погрешности, и эта погрешность будет погрешностью воспроизведения протокола аутентификации. Обратите внимание, что это нарушает REST, поскольку сообщение аутентификации не является идемпотентным. Идемпотент подразумевает, что «могут быть успешно воспроизведены злоумышленником».
Вариант 3. Не пытайтесь прикрутить протокол аутентификации к протоколу без сохранения состояния. Используйте SSL. Используйте клиентские сертификаты. Вместо того, чтобы клиент загружал строку, позвольте ему сгенерировать сертификат, или вы можете предоставить ему пару ключей. Они аутентифицируются через SSL и не аутентифицируются на вашем уровне REST. SSL имеет много «накладных расходов». Он не легкий именно потому, что он действительно решает эти проблемы с воспроизведением.
Так что, в конце концов, все зависит от того, насколько вы цените доступ к своим API.
person
rsj
schedule
09.11.2011