PKCE: защита публичных клиентов
Узнайте, что такое Proof Key for Code Exchange и как этот механизм предотвращает атаки с перехватом кода авторизации.
«PKCE: защита публичных клиентов» — бесплатный урок Cryptology Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cryptology Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cryptology Academy содержит 4 уроков всего.
Перехват кода авторизации
Без PKCE мобильные приложения уязвимы для атак с перехватом кода авторизации. Когда сервер авторизации перенаправляет код авторизации в зарегистрированную приложением пользовательскую схему URI, например myapp://callback, любое вредоносное приложение на том же устройстве, зарегистрировавшее такую же схему URI, может перехватить перенаправление и украсть код.
Как работает перехват
Атака происходит следующим образом: вредоносное приложение регистрирует ту же пользовательскую схему URI, что и легитимное приложение. Когда сервер авторизации перенаправляет код на myapp://callback, ОС может предложить оба приложения в качестве обработчиков. Если пользователь выберет вредоносное приложение или ОС назначит его обработчиком по умолчанию, злоумышленник получит код авторизации и сможет обменять его на токены, не зная секрета клиента.
Верификатор кода PKCE
PKCE (RFC 7636) добавляет динамически создаваемый секрет к потоку кода авторизации. Перед началом потока клиент создаёт криптографически случайную строку длиной от 43 до 128 символов, называемую верификатором кода. Эта строка уникальна для каждого запроса авторизации и не передаётся до этапа обмена токена.
Вычисление проверочного значения кода
Клиент вычисляет проверочное значение кода из верификатора: code_challenge = BASE64URL(SHA256(code_verifier)). Использование SHA256 — обязательный метод согласно RFC 7636; метод "plain", при котором верификатор передаётся напрямую, не рекомендуется. Проверочное значение кода — это одностороннее преобразование верификатора, поэтому знание проверочного значения не раскрывает верификатор.
Включение проверочного значения кода в авторизацию
Запрос авторизации включает два дополнительных параметра: "code_challenge=BASE64URL(SHA256(verifier))&code_challenge_method=S256". Сервер авторизации сохраняет проверочное значение кода, связанное с выданным кодом авторизации. На этом этапе серверу не передаётся секрет, который можно было бы перехватить.
Обмен токена с верификатором кода
Во время обмена токена (POST к конечной точке токенов) клиент передаёт параметр "code_verifier=ORIGINAL_RANDOM_STRING" вместе с кодом авторизации. Сервер авторизации вычисляет BASE64URL(SHA256(code_verifier)) и проверяет, совпадает ли результат с сохранённым code_challenge. Только легитимный клиент, создавший верификатор, может пройти эту проверку.
Почему перехват невозможен при использовании PKCE
Если злоумышленник перехватит код авторизации, он получит только код и проверочное значение кода, которое является общедоступным. Чтобы обменять код на токены, злоумышленнику потребуется верификатор кода. Поскольку верификатор создан легитимным клиентом и не передавался до этапа обмена токена, который выполняется безопасно, злоумышленник не может вычислить или получить этот верификатор.
PKCE предотвращает внедрение кода
PKCE также предотвращает атаки с внедрением кода авторизации, при которых злоумышленник заменяет действительный код украденным кодом в перенаправлении. Проверочное значение украденного кода не совпадет с верификатором, который предъявит клиент жертвы, поэтому обмен токена завершится ошибкой. PKCE одновременно обеспечивает эшелонированную защиту от нескольких векторов атак.
PKCE для всех клиентов
Хотя в RFC 7636 изначально PKCE описывался как решение для публичных клиентов (клиентов без секретов), документ BCP по безопасности OAuth и OAuth 2.1 требуют использовать PKCE для всех клиентов, включая конфиденциальные клиенты с секретами. PKCE обеспечивает защиту независимо от аутентификации клиента, поэтому он полезен во всех случаях.
PKCE в OAuth 2.1
OAuth 2.1 (draft-ietf-oauth-v2-1) объединяет рекомендации по безопасности из BCP по безопасности OAuth 2.0 в одном документе. Он требует использовать PKCE во всех потоках с кодом авторизации, объявляет неявный поток устаревшим и требует ротации токенов обновления. PKCE фактически является обязательной базовой защитой для любой новой реализации OAuth 2.0.
Примечания по реализации
Правильная реализация PKCE требует: использовать криптографически стойкий генератор случайных чисел для верификатора (не менее 32 случайных байтов с последующим кодированием в base64url), безопасно хранить верификатор на стороне клиента (не в URL и не в журналах), использовать метод S256 (не plain) и удалять верификатор после обмена токена. Большинство современных библиотек OAuth обрабатывают PKCE автоматически.
Проверка верификатора кода PKCE
В PKCE как связаны верификатор кода и проверочное значение кода?
Итоги урока: безопасность PKCE
PKCE (RFC 7636) предотвращает перехват кода авторизации, связывая каждый код с динамически сгенерированным верификатором кода, известным только легитимному клиенту. Из верификатора вычисляется хеш, который образует проверочное значение кода и передается открыто. Для обмена токена требуется исходный верификатор. PKCE предотвращает как перехват, так и внедрение кодов. OAuth 2.1 требует использовать PKCE во всех потоках с кодом авторизации.
Часто задаваемые вопросы
Урок «PKCE: защита публичных клиентов» бесплатный?
Да — полный текст урока «PKCE: защита публичных клиентов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cryptology Academy, подпишись на CoddyKit PRO. Курс Cryptology Academy содержит 4 уроков всего.
Чему я научусь в уроке «PKCE: защита публичных клиентов»?
Узнайте, что такое Proof Key for Code Exchange и как этот механизм предотвращает атаки с перехватом кода авторизации. Ты практикуешь Cryptology Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cryptology Academy?
Предыдущий опыт не требуется. Cryptology Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «PKCE: защита публичных клиентов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cryptology Academy?
Да. Каждый урок Cryptology Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Потоки OAuth 2.0 и типы токенов
- PKCE: защита публичных клиентов
- Утверждения OpenID Connect и токены ID
- Уязвимости OAuth и схемы атак