GoogleSQL per BigQuery supporta la crittografia autenticata con dati associati (AEAD) la crittografia.
Questo argomento spiega i concetti alla base della crittografia AEAD in GoogleSQL. Per una descrizione delle diverse funzioni di crittografia AEAD che che supporta GoogleSQL, vedi Funzioni di crittografia AEAD.
Scopo della crittografia AEAD
BigQuery protegge i tuoi dati utilizzando la crittografia at-rest. BigQuery fornisce inoltre assistenza per modelli chiavi di crittografia (CMEK), che consentono di criptare le tabelle utilizzando crittografia specifica chiave. 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 che vuoi poter "eliminare tramite crittografia". La cripto-eliminazione, o crypto-shredding, è il processo di Eliminare una chiave di crittografia per rendere illeggibili i dati criptati usando quella chiave.
Le funzioni di crittografia AEAD consentono di creare set di chiavi contenenti chiavi per la crittografia e la decrittografia, usa queste chiavi per criptare e decriptare i 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 una algoritmo per la crittografia o la decrittografia; se la chiave sia abilitato, disabilitato o eliminato; e, per le chiavi non eliminate, i byte delle chiavi le istanze server autonomamente. La chiave di crittografia primaria determina come criptare l'input testo non crittografato. La chiave di crittografia primaria non può mai essere in stato disabilitato. 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 keyset in GoogleSQL è sotto forma di buffer di protocollo serializzato
google.crypto.tink.Keyset
in BYTES
.
Esempio
Di seguito è riportato un esempio di un set di chiavi AEAD, rappresentato come una stringa JSON, con tre tasti.
{
"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 set di chiavi per la decrittografia, la funzione sceglie il valore-chiave
la chiave adeguata per la decrittografia in base all'ID chiave codificato nel testo crittografato. nel
nell'esempio precedente, tentando di decriptare utilizzando gli ID chiave 852264701
o
237910588
causerebbe un errore perché l'ID chiave 852264701
è disattivato e
L'ID 237910588
è stato eliminato. 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 chiave.
La crittografia del testo non crittografato più di una volta utilizzando lo stesso set di chiavi in genere restituisce diversi valori di testo crittografato a causa di vettori di inizializzazione (IV), che vengono scelti utilizzando generatore di numeri pseudo-casuali fornito da OpenSSL.
Set di chiavi avvolte
Se devi gestire in modo sicuro un set di chiavi o trasmetterlo tramite non attendibile, prendi in considerazione l'utilizzo di un set di chiavi con wrapping. Quando aggrega un set di chiavi non elaborato, questo processo cripta il set di chiavi non elaborato utilizzando un 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 a capo vengono utilizzati Funzioni di crittografia della busta AEAD.
Ecco 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
: aggrega un set di chiavi con wrapping con un nuovo e i dati di Google Cloud.KEYS.KEYSET_CHAIN
: ottieni un set di chiavi Tink che sia è 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. Questo di byte possono essere decriptati in un secondo momento utilizzando la stessa chiave usata per e la crittografia. 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 crittografato conterrà un Prefisso specifico 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 modalità di crittografia a due blocchi supportate dalle funzioni di crittografia AEAD sono GCM e CBC.
GCM
La modalità Galois/Counter (GCM) è una modalità per la crittografia AES. I numeri di funzione si bloccano in sequenza, quindi combina questo numero di blocco con un vettore di inizializzazione (IV). Un'inizializzazione vettoriale è un valore casuale o pseudo-casuale che costituisce la base del casuale dei dati in chiaro. 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 di crittografia 128, 192 o 256 bit di lunghezza. CBC utilizza un'inizializzazione a 16 byte come blocco iniziale e invia XOR a questo blocco con il primo blocco di testo non crittografato.
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 CBC non è consigliata a meno che non sia necessario per motivi precedenti.
Dati aggiuntivi
Le funzioni di crittografia AEAD supportano l'uso di un argomento additional_data
,
noti anche come dati associati (AD) o dati autenticati aggiuntivi.
Un testo crittografato può essere decriptato solo se vengono utilizzati gli stessi dati aggiuntivi utilizzati per criptare
per la decriptazione. 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)
durante la crittografia dei dati per un determinato cliente.
In questo modo, quando i dati vengono decriptati, sono stati precedentemente criptati utilizzando
il valore previsto per customer_id
. È richiesto lo stesso valore di additional_data
per
la decrittografia. 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 keyset 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à dati criptati con una chiave particolare, in modo che una chiave potenzialmente consentirebbe all'aggressore di accedere a meno dati.
La rotazione del set di chiavi prevede:
- Creazione di una nuova chiave di crittografia primaria in ogni set di chiavi.
- Decriptare e ricriptare tutti i dati criptati.
La KEYS.ROTATE_KEYSET
o
KEYS.ROTATE_WRAPPED_KEYSET
esegue il primo passaggio, aggiungendo una nuova chiave di crittografia primaria a un
set di chiavi e modifica della vecchia chiave di crittografia primaria in una crittografia secondaria
chiave.
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 che viene 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 senza wrapper della DEK
viene archiviato in memoria solo per la durata della query e poi eliminato.
Per ulteriori informazioni, consulta Crittografia a livello di colonna SQL con chiavi Cloud KMS.