Encriptación de la capa de aplicación

Las APIs de pagos estándar admiten PGP o JWE para la encriptación de la capa de aplicación.

Encriptación PGP

PGP es un conjunto estándar de algoritmos de encriptación, desencriptación y firma que proporcionan privacidad y autenticación criptográficas.

Cuando los socios usan el PGP para encriptar cargas útiles, deben admitir lo siguiente:

  • Encriptar y desencriptar cargas útiles con varias claves de PGP
  • Firma de cargas útiles con varias claves de PGP
  • Verificar una carga útil con varias firmas, cualquiera de las cuales puede ser la firma con la clave proporcionada por Google
  • Desencriptación de cargas útiles codificadas en Base64 seguras para la Web

Las claves públicas de PGP que se proporcionan a Google deben tener una clave secundaria que se utiliza en la encriptación. La subclave permite la rotación independiente de la clave maestra. La clave maestra se usa para la verificación de identidad. Las claves privadas deben ser claves RSA de 2,048 bits (o más) que vengan en un año con una duración máxima de dos años.

Antes de comenzar con el desarrollo, debes intercambiar las claves de PGP con Google. En este paso, generarás un par de claves públicas/privadas de PGP, proporcionarás la clave pública a Google y recibirás una de Google. Durante el desarrollo, solo deberás intercambiar las claves de la zona de pruebas que se usan para el desarrollo y las pruebas fuera de la producción. Antes del lanzamiento y las pruebas de producción, deberás realizar otro intercambio de claves de producción.

Generación de una nueva clave de PGP

Si tienes un objeto binario de GPG en la ruta de tu sistema, puedes usar el siguiente comando POSIX para crear un nuevo par de claves.

$ gpg --full-generate-key

Cuando se te solicite, selecciona una clave RSA con al menos 2,048 bits de entropía y un vencimiento de 1 a 2 años. Este comando debe crear una clave maestra (etiquetada SC, para “S'igning” y “Generación de C'ertificate) y una subclave (con la etiqueta E, por “E'ncryption).

Configuración de la biblioteca de PGP

Cómo enviar cargas útiles

  1. Cuando firmes, debes usar SHA384 como algoritmo de resumen; no uses SHA1 ni MD5
  2. Cuando encriptas, debes usar AES256 como el algoritmo de encriptación simétrica; no uses CAST5 ni IDEA
  3. Cuando encriptes o firmes mensajes, asegúrate de seleccionar la clave secundaria con el propósito correspondiente; usa la clave CAN_SIGN para firmar y la clave ENCRYPT_COMMS/ENCRYPT_STORAGE para la encriptación

Cómo recibir cargas útiles

  1. Cuando verifiques una carga útil, asegúrate de que la biblioteca admita algoritmos de hash modernos, como SHA384. Google comenzará a usarla en todas las claves nuevas a partir del 14 de mayo de 2023.
  2. Cuando desencriptes una carga útil, asegúrate de que la biblioteca admita algoritmos modernos de encriptación simétrica, como AES256. Google comenzará a usarlo en todas las claves nuevas a partir del 14 de mayo de 2023.

Ejemplo de encriptación de carga útil de GPG

El siguiente comando es un ejemplo de cómo seleccionar opciones seguras cuando se usa GPG. Se espera que esta operación se realice en un entorno de confianza en el que las personas no tienen acceso a las claves privadas ni a los archivos de entrada sensibles.

gpg --output signed-and-encrypted.pgp \
  --sign --digest-algo SHA384 \
  --encrypt --cipher-algo AES256 \
  --armor \
  --recipient {key_id} \
  input.txt

GPG seleccionará automáticamente la clave correcta del paquete para cada operación que le pidas que realice.

Encriptación JWE con firma JWS

La encriptación web JSON (JWE) es un estándar que define rfc7516 para encriptar contenido a nivel de la aplicación. La firma web JSON (JWS) es un estándar que define rfc7515 para firmar contenido en el nivel de la aplicación.

Las solicitudes y respuestas se encriptarán con tokens JWE con encriptación asimétrica (clave pública) con la opción “Serialización compacta”. El token de JWE contendrá la carga útil firmada como un token de JWS. JWS también usa claves asimétricas: clave privada para firmar y clave pública para la verificación.

Cuando envíes una carga útil, primero debes firmarla y, luego, encriptarla. Cuando recibas una carga útil, primero desencripta esta y, luego, verifica la firma.

Cuando se usa JWE, los socios deben admitir las siguientes opciones:

  • Serialización compacta.
  • Desencriptar cargas útiles de una de varias claves JWE
  • El algoritmo RSA-OAEP, RSA-OAEP-256 o ECDH-ES para la administración de claves.
  • El algoritmo A256GCM, A128GCM, A128CBC-HS256 o A256CBC-HS512 para la encriptación de contenido.
    • Se propaga en el encabezado enc.
  • kid para identificar la clave de encriptación pública.
  • Las cargas útiles de mensajes que usan encriptación JWE deben usar el tipo de contenido application/jose; charset=utf-8.

Cuando se usa JWS, los socios deben admitir las siguientes opciones:

  • Serialización compacta.
  • Verificar cargas útiles de una de varias claves JWS.
  • El algoritmo HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384 o PS512 para la creación de firmas.
  • kid para identificar la clave de firma privada

Las strings JWE/JWS se codificarán como strings UTF-8, y sus cargas útiles pueden ser bytes arbitrarios.

Las claves privadas deben ser RSA/ECDH-ES que venzan en un año con una vida útil máxima de dos años. Todas las identidades de clave privada siempre deben permanecer en el servidor del socio y, en consecuencia, todos los valores de firma deben calcularse en el servidor del socio.

Antes de comenzar con el desarrollo, debes intercambiar las claves JWE y JWS con Google. Las claves se deben intercambiar en formato JWK, como se define en rfc7517. En este paso, generarás un par de claves públicas/privadas, proporcionarás la clave pública a Google y, luego, recibirás una clave pública de Google. Durante el desarrollo, solo deberás intercambiar las claves de la zona de pruebas que se usan para el desarrollo y las pruebas fuera de la producción. Antes del lanzamiento y las pruebas de producción, deberás realizar otro intercambio de claves de producción.