Какой смысл использовать временную метку в OAuth, если одноразовый номер можно использовать только один раз? - PullRequest
34 голосов
/ 29 июля 2011

Сначала я неверно истолковал реализацию OAuth с меткой времени, полагая, что это означает, что метка времени, которая не была получена в течение 30 секунд после текущего времени, будет отклонена. Оказалось, что это неправильно по нескольким причинам, включая тот факт, что мы могли не гарантирует, что все системные часы были синхронизированы достаточно вплоть до минут и секунд независимо от часового пояса. Затем я читаю это снова, чтобы получить больше ясности:

"Если иное не указано поставщиком услуг, отметка времени выражается в количестве секунд с 1 января 1970 года 00:00:00 по Гринвичу. Значение метки времени ДОЛЖНО быть положительным целым числом и ДОЛЖНО быть равным или больше, чем отметка времени, использованная в предыдущих запросах . "

источник: http://oauth.net/core/1.0/#nonce

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

Тогда я читаю более подробное описание здесь: http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iii-security-architecture/

( TL; DR? - переходите к жирным частям ниже)

Для предотвращения повторного использования скомпрометированных запросов (воспроизведения), OAuth использует одноразовый номер и метку времени. Термин одноразовый номер означает ‘используемое число Once ’и является уникальной и обычно случайной строкой, которая предназначена для уникально идентифицировать каждый подписанный запрос. Имея уникальный идентификатор для каждого запроса поставщик услуг может предотвращать запросы от использования более одного раза. Это означает, что Потребитель генерирует уникальная строка для каждого запроса, отправленного поставщику услуг, и Поставщик услуг отслеживает все одноразовые номера, используемые для их предотвращения от использования во второй раз. Так как значение nonce включено в подпись, она не может быть изменена злоумышленником, не зная общий секрет.

Использование одноразовых номеров может быть очень дорогостоящим для поставщиков услуг, поскольку они требуют постоянное хранение всех полученных одноразовых значений. Делать реализация проще, OAuth добавляет значение метки времени к каждому запросу что позволяет поставщику услуг сохранять только одноразовые значения для ограниченное время. Когда приходит запрос с более старой отметкой времени чем оставленный период времени, он отклоняется как поставщик услуг больше нет одноразовых номеров с этого периода времени. Можно с уверенностью предположить, что запрос, отправленный после разрешенного срока, является атакой воспроизведения. OAuth обеспечивает общий механизм для реализации временных отметок, но оставляет фактическая реализация до каждого поставщика услуг (область много полагаю, следует вернуться к спецификации). Из безопасности точка зрения, реальный одноразовый номер является комбинацией значения метки времени и одноразовая строка. Только вместе они обеспечивают вечную уникальную ценность это никогда не может быть использовано злоумышленником.

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

Так может кто-нибудь прояснить это для меня? Какой смысл использовать метку времени, если одноразовый номер используется один раз, и я не сравниваю метку времени с моими собственными системными часами (потому что это, очевидно, не будет надежным). Имеет смысл, что временные метки будут только относительно друг друга, но с уникальным требованием одноразового номера это кажется неуместным.

Ответы [ 4 ]

31 голосов
/ 29 июля 2011

Метка времени позволяет серверу оптимизировать хранение одноразовых номеров. По сути, считайте, что nonce для чтения является комбинацией метки времени и случайной строки. Но, имея отдельный компонент метки времени, сервер может реализовать ограничение по времени, используя короткое окно (скажем, 15 минут), и ограничить объем памяти, который ему нужен. Без временных меток серверу потребуется бесконечное хранилище для хранения всех когда-либо использованных одноразовых номеров.

Допустим, вы решили разрешить разницу времени между вашими часами и часами до 15 минут и отслеживает одноразовые значения в таблице базы данных. Уникальный ключ для таблицы будет представлять собой комбинацию «идентификатор клиента», «маркер доступа», «nonce» и «отметка времени». При поступлении нового запроса убедитесь, что метка времени находится в пределах 15 минут от ваших часов, затем найдите эту комбинацию в своей таблице. Если найдено, отклоните вызов, в противном случае добавьте его в свою таблицу и верните запрошенный ресурс. Каждый раз, когда вы добавляете новый одноразовый номер в таблицу, удаляйте любую запись для этой комбинации «идентификатор клиента» и «маркер доступа» с отметкой времени старше 15 минут.

6 голосов
/ 29 июля 2011

Хорошо, после достаточного размышления, я думаю, что взломал этот.

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

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

Однако это работает только из-за подписи. Если они изменили метку времени или одноразовый номер в запросе, подпись больше не будет соответствовать запросу и будет отклонена (поскольку метка времени и одноразовый номер являются частью создания подписи и у них нет ключа подписи).

Уф!

0 голосов
/ 03 января 2017

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

0 голосов
/ 29 июля 2011

Если бы OAuth использовал только отметку времени, злоумышленнику было бы относительно легко угадать, какой будет следующая отметка времени, и вставить свой собственный запрос в процесс. Им просто нужно сделать «предыдущую метку времени + 1».

Используя одноразовый номер, который генерируется криптографически безопасным способом (надеюсь), злоумышленник не может просто внедрить TS + 1, потому что у него не будет правильного одноразового номера для аутентификации.

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

...