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, vedi Funzioni di crittografia AEAD.

Scopo della crittografia AEAD

BigQuery protegge i tuoi dati utilizzando la crittografia at-rest. BigQuery supporta anche le chiavi di crittografia gestite dal cliente (CMEK), che consentono 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 in modo sicuro". L'eliminazione crittografica è 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 keyset contenenti 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 keyset.

Set di chiavi

Un keyset è 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 stessa. La chiave di crittografia principale determina la modalità di crittografia del testo non crittografato dell'input. La chiave di crittografia principale non può mai essere disattivata. Le chiavi di crittografia secondarie vengono utilizzate solo per la decrittografia e possono essere in stato abilitato o disabilitato. Un keyset può essere utilizzato per decriptare tutti i dati per cui è 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 keyset 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 crittografica 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 l'altra con ID 237910588 in stato eliminato. Quando una funzione di crittografia AEAD utilizza questo keyset per la crittografia, il testo cifrato risultante codifica l'ID della chiave crittografica principale di 569259624.

Quando una funzione AEAD utilizza questo keyset per la decriptazione, sceglie la chiave appropriata per la decriptazione in base all'ID chiave codificato nel testo cifrato. Nell'esempio precedente, il tentativo di decriptare utilizzando gli ID chiave 852264701 o 237910588 genererebbe un errore, perché l'ID chiave 852264701 è disattivato e l'ID 237910588 è eliminato. Il ripristino dell'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.

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

Keyset con wrapping

Se devi gestire in modo sicuro un keyset o trasmetterlo su un canale non attendibile, valuta la possibilità di utilizzare un keyset sottoposto a wrapping. Quando esegui il wrapping di un keyset non elaborato, questo processo cripta il keyset non elaborato utilizzando una chiave Cloud KMS.

I keyset sottoposti a wrapping possono criptare e decriptare i dati senza esporre i dati del keyset. Sebbene possano esistere altri modi per limitare l'accesso ai dati a livello di campo, i set di chiavi protetti forniscono un meccanismo più sicuro per la gestione dei set di chiavi rispetto ai set di chiavi non protetti.

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

Ecco alcune funzioni con esempi di set di chiavi protette:

Advanced Encryption Standard (AES)

Le funzioni di crittografia AEAD utilizzano la crittografia Advanced Encryption Standard (AES). La crittografia AES prende come input testo non criptato, insieme a una chiave di crittografia, e restituisce come output una sequenza di byte criptata. 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 criptato conterrà un prefisso specifico di Tink che indica la chiave utilizzata per eseguire la crittografia. La crittografia AES supporta più modalità di cifratura a blocchi.

Modalità di crittografia a blocchi

Le funzioni di crittografia AEAD supportano due modalità di cifratura a blocchi: 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 non criptati. Successivamente, la funzione cripta il numero di blocco e l'IV combinati utilizzando AES. La funzione esegue quindi un'operazione logica esclusiva OR (XOR) bit a bit sul risultato della crittografia e sul testo non crittografato per produrre il testo crittografato. La modalità GCM utilizza una chiave crittografica di 128 o 256 bit.

Modalità CBC

Le "catene" CBC bloccano ogni blocco di testo non crittografato con il blocco precedente di testo crittografato prima di crittografarlo. La modalità CBC utilizza una chiave crittografica di 128, 192 o 256 bit. CBC utilizza un vettore di inizializzazione di 16 byte come blocco iniziale e esegue l'operazione XOR tra questo blocco e il primo blocco di testo non crittografato.

La modalità CBC non è uno schema AEAD in senso crittografico in quanto non garantisce 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, il CBC non è consigliato a meno che non sia necessario per motivi 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 criptato 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 criptati in precedenza utilizzando il customer_id previsto. Per la decrittografia è necessario lo stesso valore di additional_data. Per ulteriori informazioni, consulta la 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 stato 'ENABLED'. Devono inoltre utilizzare lo stesso additional_data utilizzato nella crittografia.

Quando il keyset viene utilizzato per la decriptazione, la chiave appropriata viene scelta per la decriptazione in base all'ID chiave codificato nel testo crittografato.

L'output di AEAD.DECRYPT_STRING è una STRINGA di testo normale, mentre l'output di AEAD.DECRYPT_BYTES è BYTES di testo normale. AEAD.DECRYPT_STRING può decriptare testo cifrato che codifica un valore STRING; AEAD.DECRYPT_BYTES può decriptare 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 indefinito e potrebbe generare 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 consenta a un malintenzionato di accedere a meno dati.

La rotazione del keyset prevede:

  1. Creazione di una nuova chiave crittografica principale all'interno di ogni set di chiavi.
  2. Decriptare e ricriptare tutti i dati criptati.

La funzione KEYS.ROTATE_KEYSET o KEYS.ROTATE_WRAPPED_KEYSET esegue il primo passaggio aggiungendo una nuova chiave crittografica primaria a un keyset e modificando la vecchia chiave crittografica primaria in una chiave crittografica 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 insieme di chiavi di crittografia simmetriche memorizzate in modo sicuro in Cloud Key Management Service e gestite utilizzando ruoli e autorizzazioni 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 della DEK criptata. BigQuery chiama Cloud KMS per decriptare la chiave DEK e poi la utilizza 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 ulteriori informazioni, consulta Crittografia a livello di colonna SQL con chiavi Cloud KMS.