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
- Durante la firma, dovresti usare
SHA384
come algoritmo digest; non usareSHA1
oMD5
- Durante la crittografia, devi utilizzare
AES256
come algoritmo di crittografia simmetrica; non usareCAST5
oIDEA
- 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 chiaveENCRYPT_COMMS
/ENCRYPT_STORAGE
per la crittografia
Ricezione di payload
- 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. - 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.
- Compilato nell'intestazione
alg
(rfc7518 sezione 4.1).
- Compilato nell'intestazione
- L'algoritmo A256GCM, A128GCM, A128CBC-HS256 o A256CBC-HS512 per la crittografia dei contenuti.
- Compilato nell'intestazione
enc
.
- Compilato nell'intestazione
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.
- Compilato nell'intestazione
alg
(rfc 7518 sezione 3.1).
- Compilato nell'intestazione
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.