0Pricing
Cryptology Academy · Lección

PKCE: protección de clientes públicos

Comprenda Proof Key for Code Exchange y cómo evita los ataques de interceptación del código de autorización.

PKCE: protección de clientes públicos es una lección gratuita de Cryptology Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Cryptology Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Cryptology Academy incluye 4 lecciones en total.

Intercepción del código de autorización

Sin PKCE, las aplicaciones móviles son vulnerables a ataques de intercepción del código de autorización. Cuando el servidor de autorización redirige el código de autorización al esquema de URI personalizado registrado por la aplicación (por ejemplo, myapp://callback), cualquier aplicación maliciosa del mismo dispositivo que registre el mismo esquema de URI puede interceptar la redirección y robar el código.

Cómo funciona la intercepción

El ataque funciona de la siguiente manera: una aplicación maliciosa registra el mismo esquema de URI personalizado que la aplicación legítima. Cuando el servidor de autorización redirige el código a myapp://callback, el sistema operativo puede mostrar ambas aplicaciones como controladores. Si el usuario selecciona la aplicación maliciosa o el sistema operativo la establece como predeterminada, el atacante recibe el código de autorización y puede intercambiarlo por tokens sin conocer el secreto del cliente.

Verificador de código de PKCE

PKCE (RFC 7636) añade un secreto generado dinámicamente al flujo de código de autorización. Antes de iniciar el flujo, el cliente genera una cadena criptográficamente aleatoria de entre 43 y 128 caracteres denominada verificador de código. Esta cadena es única para cada solicitud de autorización y no se transmite hasta el paso de intercambio del token.

Cálculo del desafío de código

El cliente calcula un desafío de código a partir del verificador: code_challenge = BASE64URL(SHA256(code_verifier)). El uso de SHA256 es el método requerido por RFC 7636 (no se recomienda el método "plain", que envía el verificador directamente). El desafío de código es una transformación unidireccional del verificador, por lo que conocer el desafío no revela el verificador.

Inclusión del desafío de código en la autorización

La solicitud de autorización incluye dos parámetros adicionales: "code_challenge=BASE64URL(SHA256(verifier))&code_challenge_method=S256". El servidor de autorización almacena el desafío de código asociado al código de autorización emitido. En esta etapa no se transmite al servidor ningún secreto que pudiera ser interceptado.

Intercambio del token con el verificador de código

Durante el intercambio del token (POST al endpoint de tokens), el cliente incluye "code_verifier=ORIGINAL_RANDOM_STRING" junto con el código de autorización. El servidor de autorización calcula BASE64URL(SHA256(code_verifier)) y verifica que coincida con el code_challenge almacenado. Solo el cliente legítimo que generó el verificador puede superar esta comprobación.

Por qué PKCE impide la intercepción

Si un atacante intercepta el código de autorización, solo recibe el código y el desafío de código, que es público. Para intercambiar el código por tokens, debe proporcionar el verificador de código. Puesto que el cliente legítimo generó el verificador y este nunca se transmitió hasta el intercambio del token, que se realiza de forma segura, el atacante no puede calcularlo ni obtenerlo.

PKCE evita la inyección de código

PKCE también evita los ataques de inyección del código de autorización, en los que un atacante sustituye un código válido por un código robado en la redirección. El desafío asociado al código robado no coincide con el verificador que presentará el cliente de la víctima, por lo que el intercambio de tokens falla. PKCE proporciona una defensa en profundidad contra varios vectores de ataque de forma simultánea.

PKCE para todos los clientes

Aunque RFC 7636 se describió inicialmente como una solución para clientes públicos (aquellos que no tienen secretos de cliente), el OAuth Security BCP y OAuth 2.1 exigen PKCE para todos los clientes, incluidos los clientes confidenciales que tienen secretos de cliente. PKCE proporciona protección independiente de la autenticación del cliente, por lo que resulta beneficioso en todos los casos.

PKCE en OAuth 2.1

OAuth 2.1 (draft-ietf-oauth-v2-1) consolida las prácticas recomendadas de seguridad del OAuth 2.0 Security BCP en un único documento. Exige PKCE para todos los flujos de código de autorización, desaconseja el flujo implícito y requiere la rotación de los tokens de actualización. PKCE es, en la práctica, el requisito de seguridad básico para cualquier implementación nueva de OAuth 2.0.

Notas de implementación

Implementar PKCE correctamente requiere: utilizar un generador de números aleatorios criptográficamente seguro para el verificador (al menos 32 bytes aleatorios, codificados después en base64url), almacenar el verificador de forma segura en el cliente (no en la URL ni en los registros), utilizar el método S256 (no plain) y asegurarse de descartar el verificador después del intercambio de tokens. La mayoría de las bibliotecas OAuth modernas gestionan PKCE automáticamente.

Comprobación del verificador de código de PKCE

En PKCE, ¿qué relación existe entre el verificador de código y el desafío de código?

Resumen de la lección: seguridad de PKCE

PKCE (RFC 7636) evita la interceptación del código de autorización vinculando cada código a un verificador de código generado dinámicamente que solo conoce el cliente legítimo. El verificador se somete a un hash para producir el desafío de código (que se envía públicamente). El intercambio de tokens requiere el verificador original. PKCE evita tanto los ataques de interceptación como los de inyección. OAuth 2.1 exige PKCE para todos los flujos de código de autorización.

Preguntas frecuentes

¿La lección «PKCE: protección de clientes públicos» es gratis?

Sí — el texto completo de «PKCE: protección de clientes públicos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Cryptology Academy, actualiza a CoddyKit PRO. El curso de Cryptology Academy incluye 4 lecciones en total.

¿Qué aprenderé en «PKCE: protección de clientes públicos»?

Comprenda Proof Key for Code Exchange y cómo evita los ataques de interceptación del código de autorización. Practicas Cryptology Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Cryptology Academy?

No se requiere experiencia previa. Cryptology Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «PKCE: protección de clientes públicos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Cryptology Academy?

Sí. Cada lección de Cryptology Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Flujos de OAuth 2.0 y tipos de tokens
  2. PKCE: protección de clientes públicos
  3. Claims y tokens de ID de OpenID Connect
  4. Vulnerabilidades de OAuth y patrones de ataque
← Volver a Cryptology Academy