ОБНОВЛЕНИЕ 01/23/2012
С тех пор, как я написал этот вопрос, я увидел гораздо лучший подход к защите REST, как веб-сервисы в дикой природе. Это звучало сложно, когда я впервые услышал об этом, но идея проста и доступна в Интернете как для веб-служб, так и для других безопасных коммуникаций.
Требуется использование открытых / закрытых ключей.
1.) Каждому пользователю (клиенту) конечной точки необходимо зарегистрироваться в веб-службе REST.
- а.) Вы даете этому пользователю закрытый ключ, с которым нельзя делиться
кто-нибудь
- б.) Вы также генерируете открытый ключ, который может передаваться по проводам
в текстовом виде, если это необходимо (это также будет использоваться для идентификации клиента)
2.) Каждый запрос от пользователя должен генерировать хеш для подписи запроса
- a.) Один из примеров этого может выглядеть следующим образом: закрытый ключ + временная метка + кодированная полезная нагрузка (если она достаточно мала, например, для простого обновления информации о пользователе)
- b.) Вы берете эти 3 (или что вы выбрали) и генерируете односторонний хеш (например, с помощью hmac)
- c.) В запросе, отправляемом по проводной связи, вы включаете открытый ключ (чтобы серверная сторона знала, кто пытается отправить этот запрос), сгенерированный хэш с закрытым ключом и отметка времени.
3.) Конечная точка сервера (ваш метод REST) должна будет генерировать хеш, используя те же входные данные, которые используются на клиенте. Этот шаг докажет, что и клиент, и сервер знают закрытый ключ, который соответствует открытому ключу, переданному вместе с запросом. (это, в свою очередь, означает, что пользователь, отправляющий запрос, является законным, поскольку никто другой не мог знать секретный ключ)
a.) Поиск личного ключа клиента по открытому ключу, передаваемому во время запроса
b.) Возьмите другие параметры (временную метку и кодированную полезную нагрузку) вместе с закрытым ключом, который вы нашли на предыдущем шаге, и используйте тот же алгоритм для генерации одностороннего хэша (опять же, hmac - это то, что я видел используется в реальном мире)
- c.) Результирующий однонаправленный хеш должен соответствовать хешу, отправленному по проводной связи, если не отправлять обратно 400 (или любой другой http-код, который вы считаете «неправильным запросом»)