Concetti della crittografia AEAD

GoogleSQL per BigQuery supporta la crittografia AEAD.

In questo argomento vengono spiegati i concetti alla base della crittografia AEAD in GoogleSQL. Per una descrizione delle diverse funzioni di crittografia AEAD supportate da GoogleSQL, consulta l'articolo Funzioni di crittografia AEAD.

Scopo della crittografia AEAD

BigQuery tiene al sicuro i tuoi dati utilizzando la crittografia at-rest. BigQuery fornisce inoltre supporto per chiavi di crittografia gestite dal cliente (CMEK), che ti consentono di criptare le tabelle utilizzando chiavi di crittografia specifiche. In alcuni casi, tuttavia, potresti voler criptare singoli valori all'interno di una tabella.

Ad esempio, vuoi conservare in una tabella comune i dati di tutti i tuoi clienti e criptare i dati di ogni cliente utilizzando una chiave diversa. I dati sono sparsi in più tabelle che vuoi siano in grado di "criptare-eliminare". L'eliminazione della crittografia è il processo di eliminazione di una chiave di crittografia allo scopo di rendere illeggibili i dati criptati con la chiave in questione.

Le funzioni di crittografia AEAD ti consentono di creare set di chiavi contenenti chiavi per la crittografia e la decrittografia, utilizzarle per criptare e decriptare singoli valori in una tabella e ruotare le chiavi all'interno di un set di chiavi.

Set di chiavi

Un set di chiavi è una raccolta di chiavi di crittografia, una delle quali è la chiave crittografica primaria e le altre, se presenti, sono chiavi crittografiche secondarie. Ogni chiave codifica un algoritmo per la crittografia o la decriptazione, indipendentemente dal fatto che la chiave sia abilitata, disabilitata o eliminata, e, per le chiavi non eliminate, i byte della chiave stessi. La chiave di crittografia primaria determina la modalità di crittografia del testo non crittografato di input. La chiave di crittografia primaria non può mai essere in stato disabilitato. Le chiavi di crittografia secondarie servono solo per la decrittografia e possono essere in stato attivato o disattivato. Un set di chiavi può essere utilizzato per decriptare tutti i dati utilizzati per criptare.

La rappresentazione di un set di chiavi in GoogleSQL è sotto forma di buffer di protocollo serializzato google.crypto.tink.Keyset in BYTES.

Esempio

Di seguito è riportato un esempio di set di chiavi AEAD, rappresentato come stringa JSON, con tre chiavi.

{
  "primaryKeyId": 569259624,
  "key": [
    {
      "keyData": {
        "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
        "value": "GiDPhTp5gIhfnDb6jfKOT4SmNoriIJc7ah8uRvrCpdNihA==",
        "keyMaterialType": "SYMMETRIC"
      },
      "status": "ENABLED",
      "keyId": 569259624,
      "outputPrefixType": "TINK"
    },
    {
      "keyData": {
        "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
        "value": "GiBp6aU2cFbVfTh9dTQ1F0fqM+sGHXc56RDPryjAnzTe2A==",
        "keyMaterialType": "SYMMETRIC"
      },
      "status": "DISABLED",
      "keyId": 852264701,
      "outputPrefixType": "TINK"
    },
    {
      "status": "DESTROYED",
      "keyId": 237910588,
      "outputPrefixType": "TINK"
    }
  ]
}

Nell'esempio precedente, la chiave di crittografia primaria ha un ID 569259624 ed è la prima chiave elencata nella stringa JSON. Sono presenti due chiavi crittografiche secondarie, una con ID 852264701 in stato disattivato e un'altra con ID 237910588 in stato eliminato. Quando una funzione di crittografia AEAD utilizza questo set di chiavi per la crittografia, il testo crittografato risultante codifica l'ID 569259624 della chiave crittografica primaria.

Quando una funzione AEAD utilizza questo set di chiavi per la decrittografia, la funzione sceglie la chiave appropriata per la decrittografia in base all'ID chiave codificato nel testo crittografato. Nell'esempio precedente, tentare di decriptare utilizzando gli ID chiave 852264701 o 237910588 comporterebbe un errore perché l'ID chiave 852264701 è disattivato e l'ID 237910588 viene eliminato. Se ripristini l'ID chiave 852264701 a uno stato abilitato, lo renderebbe utilizzabile per la decriptazione.

Il tipo di chiave determina la modalità di crittografia da utilizzare con quella chiave.

Se esegui la crittografia del testo non crittografato più volte con lo stesso set di chiavi in genere, vengono restituiti valori di testo crittografato diversi a causa di diversi vettori di inizializzazione (IV), che vengono scelti tramite il generatore di numeri pseudo-casuale fornito da OpenSSL.

Set di chiavi con wrapping

Se hai bisogno di gestire in modo sicuro un set di chiavi o di trasmetterlo su un canale non attendibile, valuta la possibilità di utilizzare un set di chiavi con wrapping. Quando esegui il wrapping di un set di chiavi non elaborato, questo processo cripta il set di chiavi non elaborato utilizzando una chiave Cloud KMS.

I set di chiavi con wrapping possono criptare e decriptare i dati senza esporre i dati del set di chiavi. Sebbene esistano altri modi per limitare l'accesso ai dati a livello di campo, i set di chiavi con wrapping offrono un meccanismo più sicuro per la gestione dei set di chiavi rispetto ai set di chiavi non elaborati.

Come per i set di chiavi, i set di chiavi con wrapping possono e devono essere ruotati periodicamente. I set di chiavi con wrapping vengono utilizzati nelle funzioni di crittografia envelope AEAD.

Ecco alcune funzioni con esempi di set di chiavi con wrapping:

Advanced Encryption Standard (AES)

Le funzioni di crittografia AEAD utilizzano la crittografia AES (Advanced Encryption Standard). La crittografia AES riceve testo non crittografato come input, insieme a una chiave di crittografia, e restituisce una sequenza criptata di byte come output. Questa sequenza di byte può essere decriptata in un secondo momento utilizzando la stessa chiave utilizzata per la crittografia. AES utilizza una dimensione del blocco di 16 byte, il che significa che il testo non crittografato viene trattato come una sequenza di blocchi da 16 byte. Il testo crittografato conterrà un prefisso specifico di Tink che indica la chiave utilizzata per eseguire la crittografia. La crittografia AES supporta più modalità di crittografia a blocchi.

Modalità di crittografia a blocchi

Le due modalità di crittografia a blocchi supportate dalle funzioni di crittografia AEAD sono GCM e CBC.

GCM

Galois/Counter Mode (GCM) è una modalità per la crittografia AES. I numeri di funzione vengono bloccati in sequenza e combina questo numero di blocco con un vettore di inizializzazione (IV). Un vettore di inizializzazione è un valore casuale o pseudo-casuale che costituisce la base della randomizzazione dei dati in testo non crittografato. Successivamente, la funzione cripta il numero di blocco combinato e l'IV utilizzando l'algoritmo AES. La funzione esegue quindi un'operazione esclusiva o (XOR) logica a livello di bit sul risultato della crittografia e sul testo non crittografato per produrre il testo crittografato. La modalità GCM utilizza una chiave di crittografia di 128 o 256 bit.

Modalità CBC

Le "catene" della CBC vengono bloccate mediante l'XOR di ogni blocco di testo non crittografato con il blocco di testo crittografato precedente prima della crittografia. La modalità CBC utilizza una chiave crittografica di 128, 192 o 256 bit. CBC usa un vettore di inizializzazione di 16 byte come blocco iniziale e applica XOR a questo blocco con il primo blocco di testo non crittografato.

La modalità CBC non è uno schema AEAD in senso crittografico in quanto non fornisce l'integrità dei dati; in altre parole, non verranno rilevate modifiche dannose ai dati criptati, il che compromette anche la riservatezza dei dati. Pertanto, CBC non è consigliato se non necessario per motivi precedenti.

Dati aggiuntivi

Le funzioni di crittografia AEAD supportano l'utilizzo di un argomento additional_data, noto anche come dati associati (AD) o dati autenticati aggiuntivi. Un testo crittografato può essere decriptato solo se gli stessi dati aggiuntivi utilizzati per la crittografia vengono forniti anche per la decrittografia. I dati aggiuntivi possono quindi essere usati per associare il testo crittografato a un contesto.

Ad esempio, additional_data potrebbe essere l'output di CAST(customer_id AS STRING) durante la crittografia dei dati per un determinato cliente. In questo modo, quando i dati vengono decriptati, sono stati criptati in precedenza utilizzando l'oggetto customer_id previsto. Per la decriptazione è richiesto lo stesso valore additional_data. Per ulteriori informazioni, consulta il documento RFC 5116.

Decrittografia

L'output di AEAD.ENCRYPT è testo crittografato BYTES. Le funzioni AEAD.DECRYPT_STRING o AEAD.DECRYPT_BYTES possono decriptare questo testo crittografato. Queste funzioni devono utilizzare un set di chiavi contenente la chiave utilizzata per la crittografia. La chiave deve essere in stato 'ENABLED'. Inoltre, devono utilizzare lo stesso additional_data usato per la crittografia.

Quando il set di chiavi viene utilizzato per la decrittografia, viene scelta la chiave appropriata per la decrittografia in base all'ID chiave codificato nel testo crittografato.

L'output di AEAD.DECRYPT_STRING è STRING in testo non crittografato, mentre l'output di AEAD.DECRYPT_BYTES è BYTES in testo non crittografato. AEAD.DECRYPT_STRING può decriptare il testo crittografato che codifica un valore STRING; AEAD.DECRYPT_BYTES può decriptare il testo crittografato che codifica un valore BYTES. L'utilizzo di una di queste funzioni per decriptare un testo crittografato che codifica il tipo di dati sbagliato, ad esempio l'utilizzo di AEAD.DECRYPT_STRING per decriptare il testo crittografato che codifica un valore BYTES, causa un comportamento indefinito e può causare un errore.

Rotazione chiave

Lo scopo principale della rotazione delle chiavi di crittografia è ridurre la quantità di dati criptati con una determinata chiave, in modo che una potenziale chiave compromessa possa consentire a un utente malintenzionato di accedere a una quantità inferiore di dati.

La rotazione del set di chiavi prevede:

  1. Creazione di una nuova chiave di crittografia primaria all'interno di ogni set di chiavi.
  2. Decriptare e criptare nuovamente tutti i dati criptati.

La funzione KEYS.ROTATE_KEYSET o KEYS.ROTATE_WRAPPED_KEYSET esegue il primo passaggio, aggiungendo una nuova chiave di crittografia primaria a un set di chiavi e sostituendo la chiave di crittografia primaria precedente con una chiave di crittografia secondaria.

Chiavi Cloud KMS

GoogleSQL supporta le funzioni di crittografia AEAD con le chiavi Cloud KMS per proteggere ulteriormente i dati. Questo livello di protezione aggiuntivo cripta la chiave di crittografia dei dati (DEK) con una chiave di crittografia della chiave (KEK). La KEK è un set di chiavi di crittografia simmetrica, archiviato in modo sicuro in Cloud Key Management Service e gestito mediante autorizzazioni e ruoli Cloud KMS.

Al momento dell'esecuzione della query, utilizza la funzione KEYS.KEYSET_CHAIN per fornire il percorso della risorsa KMS della KEK e il testo crittografato della DEK con wrapping. BigQuery chiama Cloud KMS per decriptare la DEK, quindi utilizza la chiave per decriptare i dati nella query. La versione senza wrapping della DEK viene archiviata in memoria solo per la durata della query e poi eliminata.

Per ulteriori informazioni, consulta Crittografia a livello di colonna SQL con le chiavi Cloud KMS.