Crittografia a livello di applicazione

Le API standard per i pagamenti supportano PGP o JWE per la crittografia a livello di applicazione.

Crittografia PGP

PGP è un insieme standard di algoritmi di crittografia, decriptazione e firma che forniscono privacy e autenticazione crittografiche.

Quando si usa PGP per criptare i payload, i partner devono supportare:

  • Crittografia e decrittografia dei payload con più chiavi PGP.
  • Firma dei payload con più chiavi PGP.
  • Verifica di un payload con più firme, ognuna delle quali può essere la firma con la chiave fornita da Google.
  • Decriptazione dei payload sicuri per il Web con codifica Base64.

Le chiavi pubbliche PGP fornite a Google devono avere una chiave secondaria utilizzata per la crittografia. La sottochiave consente la rotazione indipendente dalla chiave master. La chiave master viene utilizzata per la verifica dell'identità. Le chiavi private devono essere chiavi RSA da 2048 bit (o superiore) che scadranno dopo un anno con una durata massima di due anni.

Prima di iniziare lo sviluppo, devi scambiare le chiavi PGP con Google. In questo passaggio, dovrai generare una coppia di chiavi pubblica-privata PGP, fornire la chiave pubblica a Google e ricevere una chiave pubblica da Google. Durante lo sviluppo, dovrai scambiare solo le chiavi sandbox utilizzate per lo sviluppo e i test al di fuori della produzione. Prima dei test e del lancio della produzione, devi eseguire un altro scambio delle chiavi di produzione.

Generazione di una nuova chiave PGP

Supponendo che il percorso del tuo sistema sia un programma binario GGP, puoi utilizzare il seguente comando POSIX per creare una nuova coppia di chiavi.

$ gpg --full-generate-key

Quando richiesto, seleziona una chiave RSA con almeno 2048 bit di entropia e una scadenza di 1-2 anni. Questo comando dovrebbe creare sia una chiave master (con etichetta SC, per "generazione" e "C"ertificate) sia una sottochiave (etichettata E, per "Crittografia elettronica).

Configurazione della libreria PGP

Invio di payload

  1. Durante la firma, dovresti usare SHA384 come algoritmo digest; non usare SHA1 o MD5
  2. Durante la crittografia, devi utilizzare AES256 come algoritmo di crittografia simmetrica; non usare CAST5 o IDEA
  3. Quando cripti o firmi i messaggi, assicurati di selezionare la chiave secondaria con lo scopo corrispondente; utilizza la chiave CAN_SIGN per la firma e la chiave ENCRYPT_COMMS/ENCRYPT_STORAGE per la crittografia

Ricezione di payload

  1. Quando verifichi un payload, assicurati che la tua libreria supporti moderni algoritmi di hash come SHA384. Google inizierà a utilizzarlo su tutte le nuove chiavi a partire dal 14 maggio 2023.
  2. Quando decripta un payload, assicurati che la libreria supporti moderni algoritmi di crittografia simmetrica come AES256. Google inizierà a utilizzarlo su tutte le nuove chiavi a partire dal 14 maggio 2023.

Esempio di crittografia del payload GPG

Il comando seguente è un esempio di come selezionare opzioni sicure quando si utilizza GPG. Si prevede che questa operazione venga eseguita in un ambiente attendibile in cui gli utenti non hanno accesso alle chiavi private o ai file di input sensibili.

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

GPG selezionerà automaticamente la chiave giusta dal bundle per ogni operazione che gli chiedi di eseguire.

Crittografia JWE con firma JWS

JSON Web Encryption (JWE) è uno standard definito da rfc7516 per la crittografia dei contenuti a livello di applicazione. JSON Web Signature (JWS) è uno standard definito da rfc7515 per la firma di contenuti a livello di applicazione.

Le richieste e le risposte saranno token JWE criptati mediante crittografia asimmetrica (chiave pubblica) con l'opzione "Serializzazione compatta". Il token JWE conterrà il payload firmato come token JWS. JWS utilizza anche chiavi asimmetriche, chiave privata per la firma e chiave pubblica per la verifica.

Quando invii un payload, firmalo e quindi criptalo. Quando ricevi un payload, prima decriptalo e poi verifica la firma.

Quando utilizzi JWE, i Partner devono supportare le seguenti opzioni:

  • Serializzazione compatta.
  • Decriptazione dei payload da una o più chiavi JWE.
  • L'algoritmo RSA-OAEP, RSA-OAEP-256 o ECDH-ES per la gestione delle chiavi.
  • L'algoritmo A256GCM, A128GCM, A128CBC-HS256 o A256CBC-HS512 per la crittografia dei contenuti.
    • Compilato nell'intestazione enc.
  • kid per identificare la chiave di crittografia pubblica.
  • I payload dei messaggi che utilizzano la crittografia JWE devono utilizzare il tipo di contenuto application/jose; charset=utf-8.

Quando si utilizza JWS, i Partner devono supportare le seguenti opzioni:

  • Serializzazione compatta.
  • Verifica dei payload da una o più chiavi JWS.
  • Gli algoritmi HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384 o PS512 per la creazione di firme.
  • kid per identificare la chiave di firma privata.

Le stringhe JWE/JWS verranno codificate come stringhe UTF-8 e i relativi payload potrebbero essere byte arbitrari.

Le chiavi private devono essere chiavi RSA/ECDH-ES con scadenza un anno e una durata massima di due anni. Tutte le identità di chiave privata devono rimanere sempre sul server del partner e, di conseguenza, tutti i valori di firma devono essere calcolati sul server del partner.

Prima di iniziare lo sviluppo, devi scambiare le chiavi JWE e JWS con Google. Le chiavi devono essere scambiate in formato JWK, come definito in rfc7517. In questo passaggio, dovrai generare una coppia di chiavi pubblica-privata, fornire la chiave pubblica a Google e ricevere una chiave pubblica da Google. Durante lo sviluppo, dovrai scambiare solo le chiavi sandbox utilizzate per lo sviluppo e i test al di fuori della produzione. Prima dei test e del lancio della produzione, devi eseguire un altro scambio delle chiavi di produzione.