Concetti della crittografia AEAD

GoogleSQL per BigQuery supporta la crittografia autenticata con 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 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 primaria 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 stessi. La chiave di crittografia principale determina la modalità di crittografia del testo non crittografato di input. La chiave di crittografia principale non può mai essere in stato disattivato. 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 di crittografia principale ha un ID 569259624 ed è la prima chiave elencata nella stringa JSON. Esistono due chiavi crittografiche secondarie, una con ID 852264701 in stato disattivato 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 decrittografia, sceglie la chiave appropriata per la decrittografia in base all'ID chiave codificato nel testo cifrato. Nell'esempio precedente, il tentativo di decrittografare utilizzando gli ID chiave 852264701 o 237910588 genererebbe un errore, perché l'ID chiave 852264701 è disattivato e l'ID 237910588 è distrutto. Il ripristino dell'ID chiave 852264701 in uno stato abilitato lo renderebbe utilizzabile per la decrittografia.

Il tipo di chiave determina la modalità di crittografia da utilizzare con la 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 diversi vettori di inizializzazione (IV), che vengono scelti utilizzando il generatore di numeri pseudo-casuali fornito da OpenSSL.

Set di chiavi con wrapping

Se devi gestire in modo sicuro un keyset o trasmetterlo su un canale non attendibile, valuta la possibilità di utilizzare un keyset con wrapping. Quando esegui il wrapping di un keyset non elaborato, questo processo cripta il keyset non elaborato utilizzando una chiave Cloud KMS.

I set di chiavi sottoposti a wrapping possono criptare e decriptare i dati senza esporre i dati del set di chiavi. Sebbene possano esistere altri modi per limitare l'accesso ai dati a livello di campo, i keyset wrapped forniscono un meccanismo più sicuro per la gestione dei keyset rispetto ai keyset non elaborati.

Come per i keyset, i keyset con wrapping possono e devono essere ruotati periodicamente. I keyset con wrapping vengono utilizzati nelle funzioni di crittografia envelope AEAD.

Ecco alcune funzioni con esempi di keyset sottoposti a wrapping:

Advanced Encryption Standard (AES)

Le funzioni di crittografia AEAD utilizzano la crittografia Advanced Encryption Standard (AES). La crittografia AES prende come input testo non crittografato, insieme a una chiave di crittografia, e restituisce come output una sequenza di byte crittografata. Questa sequenza di byte può essere decrittografata in un secondo momento utilizzando la stessa chiave utilizzata per crittografarla. 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 cifrato 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. I blocchi di numeri della funzione vengono combinati in sequenza e poi questo numero di blocco viene combinato 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 blocchi 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 di crittografia di 128 o 256 bit.

Modalità CBC

CBC "chains" blocks by XORing each block of plaintext with the previous block of ciphertext prior to encrypting it. La modalità CBC utilizza una chiave di crittografia 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, la modalità CBC non è consigliata a meno che non sia necessaria per motivi di compatibilità con le versioni 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 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. Ciò garantisce che, una volta decriptati, i dati siano stati criptati in precedenza utilizzando il customer_id previsto. Per la decriptazione è necessario lo stesso valore di additional_data. Per saperne di più, consulta 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 criptato. 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 decrittografia, la chiave appropriata viene scelta per la decrittografia in base all'ID chiave codificato nel testo cifrato.

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 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:

  1. Creazione di una nuova chiave di crittografia principale all'interno di ogni set di chiavi.
  2. 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 di crittografia primaria a un keyset e modificando la vecchia chiave di crittografia primaria 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 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 simmetrica che viene memorizzato in modo sicuro in Cloud Key Management Service e gestito 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 criptato della DEK sottoposta a wrapping. BigQuery chiama Cloud KMS per decriptare la chiave DEK e poi la utilizza per decriptare i dati nella query. La versione non protetta della DEK viene archiviata in memoria solo per la durata della query e poi eliminata.

Per saperne di più, consulta Crittografia a livello di colonna SQL con chiavi Cloud KMS.