Безопасность протокола OAuth 1.0 ( RFC 5849 ) основывается на предположении, что секретный ключ, встроенный в клиентское приложение, может оставаться конфиденциальным. Однако предположение наивно.
В OAuth 2.0 ( RFC 6749 ) такое наивное клиентское приложение называется конфиденциальным клиентом. С другой стороны, клиентское приложение в среде, в которой трудно сохранить секретный ключ конфиденциальным, называется открытым клиентом. Смотри 2.1. Типы клиентов для деталей.
В этом смысле OAuth 1.0 является спецификацией только для конфиденциальных клиентов.
« OAuth 2.0 и дорога в ад » говорит, что OAuth 2.0 менее безопасен, но практической разницы в уровне безопасности между клиентами OAuth 1.0 и конфиденциальными клиентами OAuth 2.0 нет. OAuth 1.0 требует вычисления подписи, но он не повышает безопасность, если он уже уверен, что секретный ключ на стороне клиента может оставаться конфиденциальным. Вычисление подписи - это просто громоздкий расчет без какого-либо практического повышения безопасности. Я имею в виду, по сравнению с простотой, когда клиент OAuth 2.0 подключается к серверу по TLS и просто представляет, client_id
и client_secret
нельзя сказать, что громоздкие вычисления лучше с точки зрения безопасности.
Кроме того, в RFC 5849 (OAuth 1.0) ничего не говорится об открытых перенаправителях, а в RFC 6749 (OAuth 2.0) - нет. То есть oauth_callback
параметр OAuth 1.0 может стать дырой в безопасности.
Поэтому я не думаю, что OAuth 1.0 более безопасен, чем OAuth 2.0.
[Апрель 14, 2016] Дополнение, чтобы прояснить мою точку зрения
Безопасность OAuth 1.0 основана на вычислении подписи. Сигнатура вычисляется с использованием секретного ключа, где секретный ключ является общим ключом для HMAC-SHA1 ( RFC 5849, 3.4.2 ) или личным ключом для RSA-SHA1 ( RFC 5849, 3.4.3 ). Любой, кто знает секретный ключ, может вычислить подпись. Таким образом, если секретный ключ скомпрометирован, сложность вычисления подписи не имеет смысла, какой бы сложной она ни была.
Это означает, что безопасность OAuth 1.0 основана не на сложности и логике вычисления подписи, а просто на конфиденциальности секретного ключа. Другими словами, для обеспечения безопасности OAuth 1.0 требуется только условие, что секретный ключ может оставаться конфиденциальным. Это может показаться экстремальным, но вычисление подписи не добавляет улучшения безопасности, если условие уже выполнено.
Аналогично, конфиденциальные клиенты OAuth 2.0 полагаются на то же условие. Если условие уже выполнено, есть какие - либо проблемы при создании защищенного соединения с использованием TLS и отправкой client_id
и client_secret
к серверу авторизации через защищенное соединение? Есть ли большая разница в уровне безопасности между конфиденциальными клиентами OAuth 1.0 и OAuth 2.0, если оба используют одно и то же условие?
Я не могу найти вескую причину, чтобы OAuth 1.0 обвинял OAuth 2.0. Дело просто в том, что (1) OAuth 1.0 является лишь спецификацией только для конфиденциальных клиентов и (2) OAuth 2.0 упростила протокол для конфиденциальных клиентов и поддерживаемых общедоступных клиентов. Независимо от того, хорошо ли это известно или нет, приложения для смартфонов классифицируются как публичные клиенты ( RFC 6749, 9 ), которые получают выгоду от OAuth 2.0.