Concetti della crittografia AEAD

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

GoogleSQL per BigQuery supporta la crittografia 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 inoltre 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, 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 ognuno dei tuoi clienti utilizzando una chiave diversa. Disponi di dati distribuiti su più tabelle che vuoi poter "eliminare con crittografia". L'eliminazione di criptovalute, o processo di crypto-shredding, è il processo di eliminazione di una chiave di crittografia per rendere illeggibili tutti i dati criptati usando questa chiave.

Le funzioni di crittografia AEAD consentono di creare set di chiavi contenenti chiavi per la crittografia e la decriptazione, di utilizzarli per criptare e decriptare i singoli valori di una tabella e di 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 eventuali altre chiavi di crittografia secondarie. Ogni chiave codifica un algoritmo per la crittografia o la decriptazione, indipendentemente dal fatto che la chiave sia abilitata, disabilitata o eliminata e, per le chiavi non distrutte, i byte della chiave stessa. La chiave di crittografia principale determina come criptare l'input del testo non crittografato. La chiave di crittografia principale non può mai essere in stato disattivato. Le chiavi di crittografia secondarie possono essere utilizzate solo per la decriptazione e possono essere in stato attivo o disabilitato. Un set di chiavi può essere utilizzato per decriptare tutti i dati utilizzati per la crittografia.

La rappresentazione di un set di chiavi in GoogleSQL è un buffer di protocollo google.crypto.tink.Keyset serializzato in BYTES.

Esempio

Di seguito è riportato un esempio di un set di chiavi AEAD, rappresentato come una 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 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 l'altra con ID 237910588 in stato distrutto. Quando una funzione di crittografia AEAD utilizza questo set di chiavi per la crittografia, il testo di crittografia risultante 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 chiave codificato nel testo di crittografia. Nell'esempio precedente, il tentativo di decriptare mediante l'ID chiave 852264701 o 237910588 comporterebbe un errore perché l'ID chiave 852264701 è disabilitato e l'ID 237910588 viene eliminato. Il ripristino dell'ID della chiave 852264701 in uno stato attivo 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 set di chiavi restituirà generalmente valori di testo di crittografia diversi a causa di vettori di inizializzazione (IV) diversi, che vengono scelti utilizzando il generatore di numeri pseudo-casuale fornito da OpenSSL.

Set di chiavi con wrapping

Se hai bisogno di gestire un set di chiavi in modo sicuro o di trasmetterlo su un canale non attendibile, valuta la possibilità di utilizzare un set di chiavi inserito nel codice. Quando esegui il wrapping di un set di chiavi non elaborate, questo processo cripta il set di chiavi non elaborate 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 possano 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 avviene con 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 delle buste AEAD.

Di seguito sono riportate alcune funzioni con esempi di set di chiavi inseriti nel codice:

Advanced Encryption Standard (AES)

Le funzioni di crittografia AEAD utilizzano la crittografia Advanced Encryption Standard (AES). La crittografia AES prende testo normale come input, insieme a una chiave di crittografia, e restituisce una sequenza criptata di byte come output. Questa sequenza di byte può essere successivamente decriptata utilizzando la stessa chiave utilizzata per la crittografia. 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 di crittografia conterrà un prefisso specifico di sink che indica la chiave utilizzata per eseguire la crittografia. La crittografia AES supporta più modalità di crittografia a blocchi.

Blocca modalità di crittografia

Due modalità di crittografia a blocchi supportate dalle funzioni di crittografia AEAD sono GCM e CBC.

GCM

Galois/Counter Mode (GCM) è una modalità per la crittografia AES. I numeri delle funzioni si bloccano in sequenza, quindi combinano 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 non crittografato. Successivamente, la funzione cripta il numero di blocco combinato e l'IV utilizzando AES. La funzione esegue quindi un'operazione logica esclusiva o (XOR) basata sul risultato della crittografia e sul testo non crittografato per produrre il testo di crittografia. La modalità GCM utilizza una chiave crittografica di 128 o 256 bit di lunghezza.

Modalità CBC

I blocchi di "catene" CBC XOR integrano ogni blocco di testo non crittografato con il blocco di testo di crittografia precedente prima della crittografia. La modalità CBC utilizza una chiave di crittografia di 128, 192 o 256 bit. CBC utilizza un vettore di inizializzazione da 16 byte come blocco iniziale, oltre a 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, non verranno rilevate modifiche dannose ai dati criptati, che compromettono anche la riservatezza dei dati. La CBC non è pertanto consigliata a meno che non sia necessario per motivi precedenti.

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 di crittografia 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 di crittografia 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. Ciò garantisce che, durante la decriptazione, i dati siano stati criptati in precedenza utilizzando il valore previsto di customer_id. Per la decriptazione è necessario lo stesso valore additional_data. Per ulteriori informazioni, consulta RFC 5116.

Decriptazione

L'output di AEAD.ENCRYPT è testo di crittografia BYTES. Le funzioni AEAD.DECRYPT_STRING o AEAD.DECRYPT_BYTES possono decriptare questo testo criptato. Queste funzioni devono utilizzare un set di chiavi contenente la chiave utilizzata per la crittografia. La chiave deve essere in stato 'ENABLED'. Inoltre, deve 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 di crittografia.

L'output di AEAD.DECRYPT_STRING è in testo normale STRING, mentre l'output di AEAD.DECRYPT_BYTES è in testo normale BYTES. AEAD.DECRYPT_STRING può decriptare il testo di crittografia che codifica un valore STRING; AEAD.DECRYPT_BYTES può decriptare il testo di crittografia che codifica un valore BYTES. L'utilizzo di una di queste funzioni per decriptare un testo di crittografia che codifica il tipo di dati errato, ad esempio utilizzando AEAD.DECRYPT_STRING per decriptare il testo di crittografia che codifica un valore BYTES, provoca un comportamento non definito e potrebbe causare 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 possa consentire a un utente malintenzionato di accedere a meno dati.

La rotazione del set di chiavi prevede:

  1. Creare una nuova chiave di crittografia principale all'interno di ogni set di chiavi.
  2. Decriptare e criptare nuovamente 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 set 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 chiavi Cloud KMS per proteggere ulteriormente i tuoi dati. Questo ulteriore livello di protezione 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 simmetrico archiviato in sicurezza in Cloud Key Management Service e gestito mediante 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 del testo di crittografia della DEK con wrapping. BigQuery chiama Cloud KMS per decriptare la DEK e utilizza quindi questa chiave per decriptare i dati della tua query. La versione senza wrapper della DEK viene archiviata in memoria solo per la durata della query e poi eliminata.

Per ulteriori informazioni, consulta la pagina relativa alla crittografia a livello di colonna SQL con le chiavi Cloud KMS.