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