Crittografia PGP
PGP è un insieme standard di algoritmi di crittografia, decrittografia e firma che forniscono privacy e autenticazione crittografiche.
Quando utilizzi 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, una delle quali può essere la firma con la chiave fornita da Google.
- Decrittografia dei payload con codifica Base64 sicura per il web.
Le chiavi pubbliche PGP fornite a Google devono avere una sottochiave utilizzata per la crittografia. La sottochiave consente la rotazione indipendente dalla chiave primaria. La chiave primaria viene utilizzata per la verifica dell'identità. Le chiavi private devono essere chiavi RSA a 2048 bit (o superiori) che scadono 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, generi una coppia di chiavi pubblica-privata PGP, fornisci la chiave pubblica a Google e ricevi 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 di produzione e del lancio, dovrai eseguire un altro scambio di chiavi di produzione.
Generare una nuova chiave PGP
Supponendo che tu abbia un file binario GPG nel percorso di sistema, 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 primaria (etichettata SC, per 'S'igning e 'C'ertificate generation) sia una sottochiave (etichettata E, per 'E'ncryption).
Configurazione della libreria PGP
Invio di payload
- Quando firmi, devi utilizzare
SHA384come algoritmo di digest; non utilizzareSHA1oMD5 - Quando cripti, devi utilizzare
AES256come algoritmo di crittografia simmetrica; non utilizzareCAST5oIDEA - Quando cripti o firmi i messaggi, assicurati di selezionare la sottochiave con lo scopo corrispondente; utilizza la chiave
CAN_SIGNper la firma e la chiaveENCRYPT_COMMS/ENCRYPT_STORAGEper la crittografia
Ricezione di payload
- Quando verifichi un payload, assicurati che la tua libreria supporti algoritmi hash moderni come
SHA384. Google inizierà a utilizzarlo su tutte le nuove chiavi a partire dal 14 maggio 2023. - Quando decripti un payload, assicurati che la tua libreria supporti algoritmi di crittografia simmetrica moderni come
AES256. Google inizierà a utilizzarlo su tutte le nuove chiavi a partire dal 14 maggio 2023.
Esempio di crittografia dei payload GPG
Il seguente comando è un esempio di come selezionare opzioni sicure quando utilizzi GPG. Si prevede che questa operazione venga eseguita in un ambiente attendibile in cui le persone 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 corretta dal pacchetto 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 dei contenuti a livello di applicazione.
Le richieste e le risposte saranno token JWE criptati utilizzando la 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 prima e poi criptalo. Quando ricevi un payload, decriptalo prima e poi verifica la firma.
Quando utilizzi JWE, i partner devono supportare le seguenti opzioni:
- Serializzazione compatta.
- Decrittografia dei payload da una delle più chiavi JWE.
- L'algoritmo RSA-OAEP, RSA-OAEP-256 o ECDH-ES per la gestione delle chiavi.
- Inserito nell'intestazione
alg(sezione 4.1 di rfc7518).
- Inserito nell'intestazione
- L'algoritmo A256GCM,
A128GCM,
A128CBC-HS256 o
A256CBC-HS512
per la crittografia dei contenuti.
- Inserito nell'intestazione
enc.
- Inserito nell'intestazione
- Intestazione
kidper 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 utilizzi JWS, i partner devono supportare le seguenti opzioni:
- Serializzazione compatta.
- Verifica dei payload da una delle più chiavi JWS.
- L'algoritmo HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384 o PS512 per la creazione della firma.
- Inserito nell'
algintestazione (sezione 3.1 di rfc 7518).
- Inserito nell'
- Intestazione
kidper identificare la chiave di firma privata.
Le stringhe JWE/JWS verranno codificate come stringhe UTF-8 e i relativi payload possono essere byte arbitrari.
Le chiavi private devono essere chiavi RSA/ECDH-ES che scadono dopo un anno con una durata massima di due anni. Tutte le identità delle chiavi private devono sempre rimanere sul server del partner e, di conseguenza, tutti i valori delle firme 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, generi una coppia di chiavi pubblica-privata, fornisci la chiave pubblica a Google e ricevi 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 di produzione e del lancio, dovrai eseguire un altro scambio di chiavi di produzione.