Questo argomento spiega i concetti alla base della crittografia AEAD in BigQuery. Per una descrizione delle diverse funzioni di crittografia AEAD supportate da BigQuery, consulta Funzioni di crittografia AEAD.
Scopo della crittografia AEAD
BigQuery protegge i tuoi dati utilizzando la crittografia dei dati inattivi. 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 ogni dato dei tuoi clienti utilizzando una chiave diversa. Hai distribuito dati in più tabelle che vuoi criptare o eliminare. L'eliminazione delle crittografie, o crittografie, è il processo di eliminazione di una chiave di crittografia per rendere illeggibili tutti i dati criptati mediante tale chiave.
Le funzioni di crittografia AEAD consentono di creare set di chiavi che contengono chiavi per la crittografia e la decriptazione, 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 crittografiche, una delle quali è la chiave crittografica principale, mentre le altre sono chiavi crittografiche secondarie. Ogni chiave codifica un algoritmo per la crittografia o la decriptazione, se la chiave è abilitata, disabilitata o eliminata e, per le chiavi non distrutte, i byte stessi. La chiave di crittografia principale determina come criptare il testo non crittografato dell'input. La chiave di crittografia principale non può mai essere in stato disattivato. Le chiavi di crittografia secondarie vengono utilizzate solo per la decriptazione e possono essere attivate o disattivate. Un set di chiavi può essere utilizzato per decriptare i dati che sono stati utilizzati per la crittografia.
La rappresentazione di un set di chiavi in BigQuery è come un buffer di protocollo
google.crypto.tink.Keyset
in serie in BYTES
.
Esempio
Di seguito è riportato un esempio di set di chiavi AEAD, rappresentato come una stringa JSON, con tre chiavi.
primary_key_id: 569259624
key {
key_data {
type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
value: ",&\264kh\377\306\217\371\233E<\0350A4\023B-pd\203\277\240\371\212^\210bf\347\256"
key_material_type: SYMMETRIC
}
status: ENABLED
key_id: 569259624
output_prefix_type: TINK
}
key {
key_data {
type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
value: "\374\336+.\333\245k\364\010`\037\267!\376\233\\3\215\020\356B\236\240O\256U\021\266\217\277\217\271"
key_material_type: SYMMETRIC
}
status: DISABLED
key_id: 852264701
output_prefix_type: TINK
}
key {
status: DESTROYED
key_id: 237910588
output_prefix_type: 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. Quando una funzione di crittografia AEAD utilizza
questo set di chiavi per la crittografia, il testo crittografato codifica l'ID
della chiave crittografica principale di 569259624
.
Quando una funzione AEAD utilizza questo set di chiavi per la decriptazione, la funzione sceglie la chiave appropriata per la decriptazione in base all'ID della chiave codificato nel testo crittografato; nell'esempio precedente, il tentativo di decriptare mediante gli ID chiave 852264701
o 237910588
comporterebbe un errore, poiché l'ID chiave 852264701
è disabilitato e l'ID 237910588
viene eliminato. Se ripristini l'ID chiave 852264701
in uno stato abilitato,
è possibile utilizzarlo per la decriptazione.
Il tipo di chiave determina la modalità di crittografia da utilizzare con quella chiave.
La crittografia del testo non crittografato più volte utilizzando lo stesso set di chiavi restituisce in genere diversi valori di cifratura diversi a causa di diversi vettori di inizializzazione (IV), che vengono scelti utilizzando il generatore di numeri casuali assegnati da OpenSSL.
Crittografia avanzata (AES)
Le funzioni di crittografia AEAD utilizzano la crittografia AES (Advanced Encryption Standard). La crittografia AES utilizza il testo non crittografato come input, insieme a una chiave di crittografia, e restituisce come output una sequenza criptata di byte. Questa sequenza di byte può essere successivamente decriptata utilizzando la stessa chiave utilizzata per la crittografia. AES utilizza una dimensione di blocco di 16 byte, vale a dire che il testo non crittografato viene trattato come una sequenza di blocchi di 16 byte. Il testo crittografato conterrà un prefisso specifico per Tink che indica la chiave utilizzata per eseguire la crittografia. La crittografia AES supporta diverse modalità di crittografia dei blocchi.
Bloccare le modalità di crittografia
Le modalità di crittografia a due blocchi supportate dalle funzioni di crittografia AEAD sono GCM e CBC.
GCM
La modalità GCM (Galois/Counter Mode) è una modalità di crittografia AES. I numeri di funzione vengono bloccati in sequenza, poi uniscono il numero di blocco a un vettore di inizializzazione (IV). Un vettore di inizializzazione è un valore casuale o pseudo-casuale che costituisce la base della randomizzazione dei dati del testo non crittografato. Quindi, la funzione cripta il numero di blocco combinato e l'IV utilizzando l'algoritmo AES. La funzione esegue quindi un'operazione bit per logica o esclusiva (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
I blocchi "CBC" della CBC XOR un po' di ogni testo crittografato con il precedente blocco di testo crittografato 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 e XOR questo blocco con il primo blocco di testo non crittografato.
La modalità CBC non è uno schema AEAD in senso crittografico in quanto non fornisce integrità dei dati; in altre parole, le modifiche dannose ai dati criptati non verranno rilevate, il che comprometterebbe anche la riservatezza dei dati. Pertanto, il metodo CBC è sconsigliato se non è 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.
A differenza del set di chiavi, questi dati aggiuntivi non consentono da soli la decriptazione del testo crittografato risultante. Questi dati aggiuntivi garantiscono l'autenticità e l'integrità dei dati criptati, ma non la loro segretezza.
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, vengono criptati in precedenza con il customer_id
previsto. Per la decriptazione è richiesto lo stesso valore additional_data
. Per ulteriori informazioni, consulta il documento RFC 5116.
Decriptazione
Il risultato per AEAD.ENCRYPT
è il 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'
. Devono utilizzare lo stesso additional_data
utilizzato per la crittografia.
Quando il set di chiavi viene utilizzato per la decriptazione, viene scelta la chiave appropriata per la decriptazione in base all'ID chiave codificato nel testo crittografato.
L'output di AEAD.DECRYPT_STRING
è un testo non crittografato
STRING, mentre l'output di AEAD.DECRYPT_BYTES
è
testo non crittografato BYTES
. 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, come l'utilizzo di
AEAD.DECRYPT_STRING
per decriptare il testo crittografato che codifica un
valore BYTES
, causa un comportamento non definito e potrebbe
generare un errore.
Rotazione di una chiave
Lo scopo principale della rotazione delle chiavi di crittografia è ridurre la quantità di dati criptati con una chiave particolare, in modo che una potenziale chiave compromessa possa consentire a un utente malintenzionato l'accesso a una quantità inferiore di dati.
La rotazione del set di chiavi comporta:
- Creazione di una nuova chiave di crittografia primaria all'interno di ogni set di chiavi.
- Decriptazione e nuova crittografia di tutti i dati criptati.
La funzione KEYS.ROTATE_KEYSET
esegue il primo passaggio, aggiungendo una nuova chiave di crittografia primaria a un set di chiavi e cambiando la vecchia chiave di crittografia primaria.
Protezione di Cloud KMS
BigQuery supporta le funzioni AEAD con le chiavi Cloud KMS per proteggere ulteriormente i dati. Questo livello di protezione aggiuntivo cripta la tua 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 (KMS) e gestito con ruoli e autorizzazioni (IAM) e Identity and Access Management (IAM).
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 criptata. BigQuery chiama Cloud KMS per decriptare la DEK, che quindi utilizza
la 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 ulteriori informazioni, consulta la crittografia a livello di colonna SQL con chiavi Cloud KMS.