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:
KEYS.NEW_WRAPPED_KEYSET
: crea un nuovo set di chiavi sottoposte a wrapping.KEYS.ROTATE_WRAPPED_KEYSET
: ruota un set di chiavi con wrapping.KEYS.REWRAP_KEYSET
: esegui il rewrapping di un keyset sottoposto a wrapping con nuovi dati.KEYS.KEYSET_CHAIN
: recupera un keyset 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 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:
- Creazione di una nuova chiave crittografica principale all'interno di ogni set di chiavi.
- 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.