Существует несколько проблем, которые необходимо учитывать при разработке протокола подписи.Некоторые из этих проблем могут не относиться к вашей конкретной службе:
1- Обычно добавляется префикс "X-Namespace-" к нестандартным заголовкам, в вашем случае вы можете назвать свой заголовок примерно так:"X-SRAS-Content-Signature".
2 - заголовок Date может не обеспечивать достаточного разрешения для значения nonce, поэтому я бы посоветовал использовать метку времени с разрешением не менее 1 миллисекунды.
3- Если вы не сохраните хотя бы последний одноразовый номер, можно все равно воспроизвести сообщение в 10-минутном окне, что, вероятно, недопустимо для запроса POST (может создать несколько экземпляров с одинаковыми значениями в веб-службе REST).Это не должно быть проблемой для команд GET PUT или DELETE.
Однако в PUT это можно использовать для атаки типа «отказ в обслуживании», заставляя многократно обновлять один и тот же объект в предлагаемом 10-минутном окне.,В GET или DELETE существует похожая проблема.
Поэтому вам, вероятно, необходимо сохранить хотя бы последний использованный одноразовый номер, связанный с каждым идентификатором пользователя, и поделиться этим состоянием между всеми вашими серверами аутентификации в режиме реального времени.
4- Этот метод также требует, чтобы клиент и серверы были синхронизированы по часам с перекосом менее 10 минут.Это может быть сложно для отладки или невозможно применить, если у вас есть клиенты AJAX, для которых вы не контролируете часы.Для этого также необходимо установить все временные метки в UTC.
Альтернативой является отмена требования к 10-минутному окну, но убедитесь, что временные метки увеличиваются монотонно, что снова требует сохранения последнего одноразового номера.Это по-прежнему проблема, если часы клиента обновляются до даты, предшествующей последнему использовавшемуся одноразовому номеру.В доступе будет отказано до тех пор, пока часы клиента не пропустят последний одноразовый номер или не будет сброшено состояние одноразового номера сервера.
Монотонно увеличивающийся счетчик не подходит для клиентов, которые не могут сохранить состояние, если только клиент не может запросить последний использованныйодноразовый номер на сервер.Это будет сделано один раз в начале каждого сеанса, а затем счетчик будет увеличиваться при каждом запросе.
5 - Необходимо также обратить внимание на повторные передачи из-за сетевых ошибок.Вы не можете предполагать, что сервер не получил последнее сообщение, для которого TCP-подтверждение не было получено клиентом до разрыва TCP-соединения.Поэтому одноразовый номер необходимо увеличивать между каждой повторной передачей выше уровня TCP и пересчетом сигнатуры с новым одноразовым номером.Тем не менее, необходимо добавить номер сообщения для предотвращения двойного выполнения на сервере: двойной POST приведет к созданию объекта 2.
6 - Вам также необходимо подписать идентификатор пользователя, в противном случае злоумышленник можетчтобы воспроизвести одно и то же сообщение для всех пользователей, чьи одноразовые номера еще не достигли сообщения повторного сообщения.
7 - Ваш метод не гарантирует клиенту подлинность сервера и отсутствие перехвата DNS.Проверка подлинности сервера обычно считается важной для безопасной связи.Эта услуга может быть предоставлена путем подписания ответов от сервера, используя тот же одноразовый номер, что и для запроса.