GoogleSQL per BigQuery supporta la crittografia con autenticazione e dati associati (AEAD).
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 consentono di criptare le tabelle utilizzando chiavi di crittografia specifiche. In alcuni casi, però, 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 di cui vuoi poter eseguire la "crypto-eliminazione". L'eliminazione crittografica, o sminuzzamento crittografico, è il processo di eliminazione di una chiave di crittografia per rendere illeggibili i dati criptati con quella chiave.
Le funzioni di crittografia AEAD ti consentono di creare insiemi di chiavi contenenti chiavi per la crittografia e la decrittografia, di utilizzare queste chiavi per criptare e decriptare i singoli valori di una tabella e di ruotare le chiavi all'interno di un insieme 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 è attivata, disattivata o eliminata; e, per le chiavi non eliminate, i byte della chiave stessa. La chiave di crittografia principale determina in che modo criptare il testo non cifrato di input. La chiave di crittografia principale non può mai essere in stato disattivato. Le chiavi di crittografia secondarie sono solo per la decrittografia e possono essere attivate o disattivate. Un insieme di chiavi può essere utilizzato per decriptare i dati per i quali è stato utilizzato per la crittografia.
La rappresentazione di un set di chiavi in GoogleSQL è un buffer del protocollo google.crypto.tink.Keyset serializzato in BYTES
.
Esempio
Di seguito è riportato un esempio di un insieme 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 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 di disattivazione e un'altra con ID 237910588
in stato di eliminazione. Quando una funzione di crittografia AEAD utilizza questo insieme di chiavi per la crittografia, il testo cifrato risultante codifica l'ID della chiave di crittografia principale di 569259624
.
Quando una funzione AEAD utilizza questo insieme di chiavi per la decrittografia, sceglie la chiave appropriata in base all'ID chiave codificato nel testo cifrato. Nell'esempio riportato sopra, il tentativo di decrittografia utilizzando gli ID chiave 852264701
o 237910588
causerebbe un errore, perché l'ID chiave 852264701
è disattivato e l'ID 237910588
viene distrutto. Il ripristino dell'ID chiave 852264701
a uno 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 cifrato più di una volta utilizzando lo stesso insieme di chiavi in genere restituisce valori di testo cifrato diversi a causa di diversi vettori di inizializzazione (IV), che vengono scelti utilizzando il generatore di numeri pseudo-casuali fornito da OpenSSL.
Insiemi di chiavi con wrapping
Se devi gestire in modo sicuro un insieme di chiavi o trasmetterlo tramite un canale non attendibile, ti consigliamo di utilizzare un insieme di chiavi con wrapping. Quando esegui il wrapping di un insieme di chiavi non elaborato, questo processo cripta l'insieme 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 potrebbero esserci 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 dell'involucro AEAD.
Di seguito sono riportate alcune funzioni con esempi di set di chiavi con wrapping:
KEYS.NEW_WRAPPED_KEYSET
: crea un nuovo set di chiavi con wrapping.KEYS.ROTATE_WRAPPED_KEYSET
: ruota un set di chiavi con wrapping.KEYS.REWRAP_KEYSET
: riavvolgi un insieme di chiavi con nuovi dati.KEYS.KEYSET_CHAIN
: ottieni un insieme di chiavi Tink criptato con una chiave Cloud KMS.
Advanced Encryption Standard (AES)
Le funzioni di crittografia AEAD utilizzano la crittografia Advanced Encryption Standard (AES). La crittografia AES prende in input il testo non cifrato, insieme a una chiave crittografica, e restituisce in output una sequenza di byte criptata. Questa sequenza di byte può essere decriptata in un secondo momento utilizzando la stessa chiave utilizzata per cifrarla. AES utilizza una dimensione del blocco di 16 byte, il che significa che il testo non criptato 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
La modalità Galois/Counter (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-casuale che costituisce la base della randomizzazione dei dati in testo normale. Successivamente, la funzione cripta il numero di blocco e l'IV combinati utilizzando AES. La funzione esegue quindi un'operazione OR (XOR) logica a livello di bit sul risultato della crittografia e sul testo in chiaro per produrre il testo cifrato. La modalità GCM utilizza una chiave crittografica di 128 o 256 bit.
Modalità CBC
CBC "collega" i blocchi eseguendo l'operazione XOR tra ogni blocco di testo non cifrato e il blocco di testo cifrato precedente prima di criptarlo. 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 con il primo blocco di testo non cifrato.
La modalità CBC non è un 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 confidentialità dei dati. Pertanto, la crittografia CBC non è consigliata, a meno che non sia necessaria per motivi legacy.
Dati aggiuntivi
Le funzioni di crittografia AEAD supportano l'utilizzo di un argomento additional_data
, conosciuto 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
customer_id
previsto. Per la decrittografia è richiesto lo stesso valore additional_data
. Per ulteriori informazioni, consulta
RFC 5116.
Decriptazione
L'output di AEAD.ENCRYPT
è la crittografia BYTES
. Le funzioni
AEAD.DECRYPT_STRING
o
AEAD.DECRYPT_BYTES
possono decriptare questo
cifrato. Queste funzioni devono utilizzare un set di chiavi che contiene la chiave utilizzata per la crittografia. La chiave deve essere in stato
'ENABLED'
. Inoltre, devono utilizzare lo stesso additional_data
utilizzato per la crittografia.
Quando il set di chiavi viene utilizzato per la decrittografia, viene scelta la chiave appropriata in base all'ID chiave codificato nel testo criptato.
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 il testo cifrato che codifica un valore STRING;AEAD.DECRYPT_BYTES
può decriptare il testo cifrato che codifica un valoreBYTES
. L'utilizzo di una di queste funzioni per decriptare un testo cifrato che codifica il tipo di dati sbagliato, ad esempio l'utilizzo di AEAD.DECRYPT_STRING
per decriptare un testo cifrato che codifica un valore BYTES
, causa un comportamento non definito e può comportare 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 set di chiavi prevede:
- Creazione di una nuova chiave crittografica principale in ogni set di chiavi.
- Decriptazione 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
insieme 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 aggiuntivo di protezione cripta la chiave di crittografia dei dati (DEK) con una chiave di crittografia della chiave (KEK). La KEK è un insieme di chiavi di crittografia simmetrica memorizzato in modo sicuro in Cloud Key Management Service e gestito utilizzando le autorizzazioni e i 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 della DEK criptata. BigQuery chiama Cloud KMS per scompattare 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, dopodiché viene distrutta.
Per ulteriori informazioni, consulta Crittografia a livello di colonna SQL con chiavi Cloud KMS.