Concetti della crittografia AEAD

La crittografia autenticata con dati associati (AEAD) in GoogleSQL per BigQuery ti consente di proteggere i dati sensibili a livello di colonna e di controllare la decrittografia direttamente all'interno delle query. Associando il testo cifrato a dati autenticati aggiuntivi, la crittografia AEAD verifica l'integrità dei dati e impedisce la manomissione o la sostituzione non autorizzata del testo cifrato.

Per un elenco completo delle funzioni SQL supportate, 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 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 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 tramite crittografia". La cripto-eliminazione, o cripto-distruzione, è il processo di eliminazione di una chiave di crittografia per rendere illeggibili i dati criptati utilizzando quella chiave.

Le funzioni di crittografia AEAD consentono di creare set di chiavi che contengono chiavi per la crittografia e la decrittografia, utilizzare queste chiavi 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 di crittografia principale e le altre, se presenti, sono chiavi di crittografia secondarie. Ogni chiave codifica un algoritmo per la crittografia o la decrittografia, se la chiave è abilitata, disabilitata o eliminata e, per le chiavi non eliminate, i byte della chiave stessi. 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 disattivato. Le chiavi di crittografia secondarie servono solo per la decriptazione e possono essere in stato abilitato o disabilitato. Un set di chiavi può essere utilizzato per decriptare tutti i dati per i quali è stato utilizzato per la crittografia.

La rappresentazione di un keyset in GoogleSQL è un buffer di protocollo google.crypto.tink.Keyset serializzato in BYTES.

Esempio

Di seguito è riportato un esempio di un 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 disattivato e un'altra con ID 237910588 in stato eliminato definitivamente. Quando una funzione di crittografia AEAD utilizza questo keyset per la crittografia, il testo cifrato risultante codifica l'ID della chiave di crittografia principale di 569259624.

Quando una funzione AEAD utilizza questo keyset per la decrittografia, la funzione sceglie la chiave appropriata per la decrittografia in base all'ID chiave codificato nel testo cifrato. Nell'esempio precedente, il tentativo di decrittografia utilizzando gli ID chiave 852264701 o 237910588 genera un errore, perché l'ID chiave 852264701 è disabilitato e l'ID 237910588 è eliminato. Il ripristino dell'ID chiave 852264701 in uno stato abilitato lo renderebbe utilizzabile per la decrittografia.

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

La crittografia del testo non crittografato più di una volta utilizzando lo stesso keyset restituisce generalmente valori di testo crittografato diversi a causa di vettori di inizializzazione (IV) diversi, scelti utilizzando il generatore di numeri pseudo-random fornito da OpenSSL.

Keyset 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 elaborate, questo processo cripta il set di chiavi non elaborate 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 forniscono un meccanismo più sicuro per la gestione dei set di chiavi rispetto ai set di chiavi non elaborati.

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

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

Advanced Encryption Standard (AES)

Le funzioni di crittografia AEAD utilizzano la crittografia AES (Advanced Encryption Standard). La crittografia AES accetta come input il testo non crittografato, insieme a una chiave di crittografia, e restituisce come output una sequenza di byte crittografata. Questa sequenza di byte può essere decriptata in un secondo momento utilizzando la stessa chiave utilizzata per criptarla. AES utilizza una dimensione di blocco di 16 byte, il che significa che il testo non crittografato viene trattato come una sequenza di blocchi di 16 byte. Il testo cifrato 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. La funzione numera i blocchi in sequenza, quindi combina questo numero di blocco con un vettore di inizializzazione (IV). Un vettore di inizializzazione è un valore casuale o pseudo-random 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 per bit di tipo OR esclusivo (XOR) sul risultato della crittografia e sul testo non crittografato per produrre il testo cifrato. La modalità GCM utilizza una chiave di crittografia di 128 o 256 bit.

Modalità CBC

La modalità CBC "concatena" i blocchi eseguendo un'operazione XOR su ogni blocco di testo non crittografato con il blocco di testo cifrato precedente prima di crittografarlo. La modalità CBC utilizza una chiave di crittografia di 128, 192 o 256 bit. CBC utilizza un vettore di inizializzazione di 16 byte come blocco iniziale e applica l'operazione XOR a questo blocco con il primo blocco di testo non crittografato.

La modalità CBC non è uno schema AEAD in senso crittografico perché 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, CBC non è consigliato, a meno che non sia necessario per motivi di compatibilità con i sistemi legacy.

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 cifrato 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 cifrato 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 precedentemente criptati utilizzando il customer_id previsto. Per la decrittografia è richiesto lo stesso valore additional_data. Per saperne di più, consulta RFC 5116.

Decriptazione

L'output di AEAD.ENCRYPT è il testo cifrato BYTES. Le funzioni AEAD.DECRYPT_STRING o AEAD.DECRYPT_BYTES possono decriptare questo testo cifrato. Queste funzioni devono utilizzare un keyset che contiene la chiave utilizzata per la crittografia. La chiave deve essere in uno stato 'ENABLED'. Devono inoltre utilizzare lo stesso additional_data utilizzato nella 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 cifrato.

L'output di AEAD.DECRYPT_STRING è una STRINGA di testo non crittografato, mentre l'output di AEAD.DECRYPT_BYTES è BYTES di testo non crittografato. AEAD.DECRYPT_STRING può decriptare il testo cifrato che codifica un valore STRING; AEAD.DECRYPT_BYTES può decriptare il testo cifrato che codifica un valore BYTES. L'utilizzo di una di queste funzioni per decriptare un testo cifrato che codifica il tipo di dati errato, ad esempio l'utilizzo di AEAD.DECRYPT_STRING per decriptare un testo cifrato che codifica un valore BYTES, causa un comportamento non definito e potrebbe generare un errore.

Rotazione delle chiavi

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. Decriptazione e nuova crittografia 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 archiviato in modo sicuro in Cloud Key Management Service e gestito utilizzando autorizzazioni e ruoli di 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 cifrato dalla DEK con wrapping. BigQuery chiama Cloud KMS per eseguire l'unwrapping della DEK, quindi utilizza la chiave per decriptare i dati nella query. La versione non sottoposta a wrapping 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 chiavi Cloud KMS.