Concetti della crittografia AEAD

GoogleSQL per BigQuery supporta la crittografia AEAD (Authenticated Encryption with Associated Data).

Questo argomento spiega i concetti alla base della crittografia AEAD in GoogleSQL. Per una descrizione delle diverse funzioni di crittografia AEAD supportate da GoogleSQL, consulta Funzioni di crittografia AEAD.

Scopo della crittografia AEAD

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

Ad esempio, vuoi conservare i dati di tutti i tuoi clienti in una tabella comune e criptare i dati di ciascun cliente utilizzando una chiave diversa. Hai dati distribuiti su più tabelle che vuoi poter "eliminare con la crittografia". L'eliminazione con la crittografia, o crypto-shredding, è il processo di eliminazione di una chiave di crittografia per rendere illeggibili tutti i dati criptati utilizzando quella chiave.

Le funzioni di crittografia AEAD consentono di creare set di chiavi contenenti chiavi per la crittografia e la decrittografia, di utilizzare queste chiavi per criptare e decriptare i singoli valori in una tabella e di 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 di crittografia principale e le altre, se presenti, sono chiavi di crittografia secondarie. Ogni chiave codifica un algoritmo per la crittografia o la decrittografia, indica se la chiave è abilitata, disabilitata o eliminata e, per le chiavi non eliminate, i byte della chiave stessa. La chiave di crittografia principale determina come criptare il testo non crittografato di input. La chiave di crittografia principale non può mai essere in stato disabilitato. Le chiavi di crittografia secondarie sono solo per la decrittografia e possono essere in stato abilitato o disabilitato. Un set di chiavi può essere utilizzato per decriptare tutti i dati che sono stati criptati con esso.

La rappresentazione di un set di chiavi in GoogleSQL è un 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 principale ha un ID 569259624 ed è la prima chiave elencata nella stringa JSON. Esistono due chiavi di crittografia secondarie, una con ID 852264701 in stato disabilitato 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 della chiave di crittografia principale 569259624.

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 della chiave codificato nel testo crittografato; nell'esempio precedente, il tentativo di decriptare utilizzando gli ID delle chiavi 852264701 o 237910588 genererebbe un errore, perché l'ID della chiave 852264701 è disabilitato e l'ID 237910588 è eliminato. Il ripristino dell'ID della chiave 852264701 in stato abilitato lo renderebbe utilizzabile per la decrittografia.

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

La crittografia del testo non crittografato più di una volta utilizzando lo stesso set di chiavi in genere restituisce valori di testo crittografato diversi a causa di diversi vettori di inizializzazione (IV), scelti utilizzando il generatore di numeri pseudocasuali fornito da OpenSSL.

Set di chiavi con wrapping

Se devi gestire in modo sicuro un set di chiavi o 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 possano esistere altri modi per limitare l'accesso ai dati a livello di campo, i set di chiavi con wrapping forniscono 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 Advanced Encryption Standard (AES). La crittografia AES accetta come input testo non crittografato, insieme a una chiave di crittografia, e restituisce una sequenza di byte criptata come output. Questa sequenza di byte può essere decriptata in un secondo momento utilizzando la stessa chiave utilizzata per criptarla. AES utilizza una dimensione del blocco di 16 byte, il che significa che il testo non crittografato viene trattato come una sequenza di blocchi di 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

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. La funzione numera i blocchi in sequenza e poi combina questo numero di blocco con un vettore di inizializzazione (IV). Un vettore di inizializzazione è un valore casuale o pseudocasuale che costituisce la base della randomizzazione dei dati in testo non crittografato. Successivamente, la funzione cripta il numero di blocco e l'IV combinati utilizzando AES. La funzione esegue quindi un'operazione logica bit a bit OR esclusivo (XOR) 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 di lunghezza.

Modalità CBC

La modalità CBC "concatena" i blocchi eseguendo l'operazione XOR di ogni blocco di testo non crittografato con il blocco di testo crittografato precedente prima di criptarlo. La modalità CBC utilizza una chiave di crittografia di 128, 192 o 256 bit di lunghezza. CBC utilizza un vettore di inizializzazione di 16 byte come blocco iniziale ed esegue l'operazione XOR di 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, le modifiche dannose ai dati criptati non verranno rilevate, il che compromette anche la riservatezza dei dati. Pertanto, la modalità CBC non è consigliata a meno che non sia necessaria per motivi di compatibilità con le versioni precedenti.

Dati aggiuntivi

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

Ad esempio, additional_data potrebbe essere l'output di CAST(customer_id AS STRING) quando si criptano i dati di un cliente specifico. In questo modo, quando i dati vengono decriptati, sono stati criptati in precedenza utilizzando l'customer_id previsto. Per la decrittografia è necessario lo stesso valore additional_data. Per saperne di più, consulta RFC 5116.

Decrittografia

L'output di AEAD.ENCRYPT è testo crittografato BYTES. Le AEAD.DECRYPT_STRING o AEAD.DECRYPT_BYTES funzioni possono decriptare questo testo crittografato. Queste funzioni devono utilizzare un set di chiavi che contenga la chiave utilizzata per la crittografia. La chiave deve essere in uno stato 'ENABLED'. Devono inoltre utilizzare gli stessi additional_data utilizzati nella crittografia.

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

L'output di AEAD.DECRYPT_STRING è una STRINGA di testo non crittografato, mentre l'output di AEAD.DECRYPT_BYTES è un BYTES di 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 errato, ad esempio l'utilizzo di AEAD.DECRYPT_STRING per decriptare un testo crittografato che codifica un valore BYTES, causa un comportamento indefinito e potrebbe generare un errore.

Rotazione della 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 consenta a un utente malintenzionato di accedere a meno dati.

La rotazione del set di chiavi prevede:

  1. Creazione di una nuova chiave di crittografia principale all'interno di ogni set di chiavi.
  2. Decrittografia e ricrittografia di tutti i dati criptati.

La funzione KEYS.ROTATE_KEYSET o KEYS.ROTATE_WRAPPED_KEYSET esegue il primo passaggio, aggiungendo una nuova chiave di crittografia principale a un set di chiavi e modificando la vecchia chiave di crittografia principale in una chiave di crittografia secondaria

Chiavi Cloud KMS

GoogleSQL supporta le funzioni di crittografia AEAD con le chiavi Cloud KMS per proteggere ulteriormente i tuoi 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 che è archiviato in modo sicuro in Cloud Key Management Service e gestito utilizzando autorizzazioni e ruoli Cloud KMS.

Al momento dell'esecuzione della query, utilizza la KEYS.KEYSET_CHAIN funzione 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 e poi utilizza questa chiave per decriptare i dati nella query. La versione decriptata della DEK viene archiviata in memoria solo per la durata della query e poi eliminata.

Per saperne di più, consulta Crittografia a livello di colonna SQL con le chiavi Cloud KMS.