Crittografia di Always Encrypted

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

Questo articolo descrive algoritmi e meccanismi di crittografia per derivare il materiale crittografico usato nella funzionalità Always Encrypted in SQL Server e database SQL di Azure. Questi algoritmi si applicano a tutte le edizioni e le versioni di Always Encrypted; Always Encrypted con e senza enclave sicuri usano lo stesso algoritmo di crittografia.

Chiavi, archivi di chiavi e algoritmi di crittografia delle chiavi

La funzionalità Crittografia sempre attiva usa due tipi di chiavi: le chiavi master di colonna e le chiavi di crittografia di colonna.

La chiave CMK (Column Master Key, chiave master della colonna) è una chiave usata per crittografare altre chiavi. Resta sempre sotto il controllo del client ed è memorizzata in un archivio di chiavi esterno. Il driver client con Always Encrypted abilitato interagisce con l'archivio delle chiavi tramite un provider dell'archivio CMK, che può far parte o della libreria del driver (un provider Microsoft/di sistema) oppure dell'applicazione client (un provider personalizzato). Al momento, i cataloghi di driver client includono provider di archivio di chiavi Microsoft per Archivio certificati di Windows e moduli di protezione hardware (HSM). Per l'elenco corrente dei provider, vedere CREATE COLUMN MASTER KEY (Transact-SQL). Uno sviluppatore di applicazioni può realizzare un provider personalizzato per un archivio arbitrario.

La chiave CEK (Column Encryption Key, chiave di crittografia della colonna) è una chiave di crittografia del contenuto, ovvero una chiave usata per proteggere i dati, protetta da una chiave CMK.

Tutti i provider di archiviazione CMK di Microsoft crittografano le CEK utilizzando RSA con Optimal Asymmetric Encryption Padding (RSA-OAEP). Il provider di archivio di chiavi che supporta le API di crittografia di Microsoft: Next Generation (CNG) in .NET Framework (classe SqlColumnEncryptionCngProvider) usa i parametri predefiniti specificati da RFC 8017 nella sezione A.2.1. Tali parametri predefiniti usano una funzione hash di SHA-1 e una funzione di generazione della maschera MGF1 con SHA-1. Tutti gli altri provider di archivi di chiavi usano SHA-256.

Always Encrypted usa internamente moduli di crittografia convalidati FIPS 140-2.

Algoritmo di crittografia dei dati

La funzionalità Always Encrypted usa l'algoritmo AEAD_AES_256_CBC_HMAC_SHA_256 per crittografare i dati nel database. AEAD è l'acronimo di Authenticated Encryption with Associated Data; HMAC è l'acronimo di hash-based message authentication code; MAC è l'acronimo di message authentication code (Codice di autenticazione del messaggio).

AEAD_AES_256_CBC_HMAC_SHA_256 deriva dalla bozza di specifica IETF. L’algoritmo usa uno schema di crittografia autenticata con dati associati che adotta l’approccio Encrypt-then-MAC. Tale approccio prevede prima la crittografia del testo non crittografato e quindi la generazione del MAC in base al testo crittografato risultante.

Per nascondere i modelli, l'algoritmo AEAD_AES_256_CBC_HMAC_SHA_256 usa la modalità operativa CBC (Cipher Block Chaining), che prevede l'immissione nel sistema di un valore iniziale denominato IV (vettore di inizializzazione). La descrizione completa della modalità CBC è disponibile nel National Institute of Standards and Technology (NIST) degli Stati Uniti.

L'algoritmoAEAD_AES_256_CBC_HMAC_SHA_256 calcola il valore del testo crittografato per un determinato valore del testo non crittografato con la procedura seguente.

Passaggio 1: Generare il vettore di inizializzazione (IV)

La funzionalità Always Encrypted supporta due varianti di AEAD_AES_256_CBC_HMAC_SHA_256:

  • Randomizzato

  • Deterministico

Nella crittografia casuale l’IV viene generato in modo casuale. Di conseguenza, quando viene crittografato lo stesso testo non crittografato, viene generato un testo crittografato diverso, impedendo così l'intercettazione delle informazioni.

When using randomized encryption: IV = Generate cryptographically random 128bits  

Per la crittografia deterministica, il vettore di inizializzazione non viene generato in modo casuale, ma è derivato dal valore di testo non crittografato usando l'algoritmo seguente:

When using deterministic encryption: IV = HMAC-SHA-256( iv_key, cell_data ) truncated to 128 bits.  

Dove iv_key è derivato dalla chiave CEK come indicato di seguito:

iv_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell IV key" + algorithm + CEK_length)  

Il troncamento del valore HMAC viene eseguito in modo da adattarsi a un blocco di dati, come richiesto per l'IV. Di conseguenza, la crittografia deterministica genera sempre lo stesso testo crittografato per un determinato testo non crittografato, consentendo di dedurre se due valori di testo non crittografato sono uguali confrontando i relativi valori del testo crittografato. Questa limitata divulgazione di informazioni consente al sistema di database di supportare il confronto di uguaglianza sui valori delle colonne crittografate.

La crittografia deterministica è più efficace nel nascondere i modelli rispetto ad alternative quali, ad esempio, l’uso di un valore IV predefinito.

Passaggio 2: Calcolo del testo crittografato AES_256_CBC

Per l'algoritmo di AEAD_AES_256_CBC_HMAC_SHA_256 Always Encrypted, dopo aver calcolato l'IV nel passaggio 1, viene generato il testo crittografato AES_256_CBC:

aes_256_cbc_ciphertext = AES-CBC-256(enc_key, IV, cell_data) with PKCS7 padding.  

Dove la chiave di crittografia (enc_key) è derivata dalla chiave di crittografia della colonna (CEK) come indicato di seguito:

enc_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell encryption key" + algorithm + CEK_length )  

Passaggio 3: Calcolo del MAC

Per l'algoritmo AEAD_AES_256_CBC_HMAC_SHA_256 always Encrypted, il MAC (codice di autenticazione del messaggio) viene calcolato dal byte della versione, dall'IV (dal passaggio 1) e dal testo crittografato AES_256_CBC (dal passaggio 2), usando un mac_key derivato dalla chiave di crittografia della colonna (CEK):

MAC = HMAC-SHA-256(mac_key, versionbyte + IV + Ciphertext + versionbyte_length)  

Dove:

versionbyte = 0x01 and versionbyte_length = 1
mac_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell MAC key" + algorithm + CEK_length)  

Passaggio 4: Concatenazione

Per l'algoritmo di AEAD_AES_256_CBC_HMAC_SHA_256 always Encrypted, il valore crittografato finale viene generato concatenando il byte della versione dell'algoritmo, il MAC (dal passaggio 3), il iv (dal passaggio 1) e il testo crittografato AES_256_CBC (dal passaggio 2):

aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext  

Lunghezza del testo crittografato

La lunghezza in byte dei singoli componenti del testo crittografato AEAD_AES_256_CBC_HMAC_SHA_256 è:

Componente Dimensioni (byte)
versionbyte 1
MAC 32
IV 16
aes_256_cbc_ciphertext (FLOOR(DATALENGTH(cell_data) / block_size) + 1) * block_size, dove block_size è 16 byte ed cell_data è il valore di testo non crittografato. La dimensione minima di aes_256_cbc_ciphertext è un blocco (16 byte).

La lunghezza del testo crittografato, risultante dalla crittografia dei valori di un determinato testo non crittografato (cell_data), può essere calcolata con la formula seguente:

1 + 32 + 16 + (FLOOR(DATALENGTH(cell_data)/16) + 1) * 16  

Ad esempio:

  • Dopo la crittografia, un valore di testo non crittografato int lungo 4 byte diventa un valore binario lungo 65 byte.

  • Un valore di testo non crittografato lungo 2.000 byte nchar(1000) diventa un valore binario long di 2.065 byte dopo la crittografia.

La lunghezza del testo crittografato dipende dal tipo di dati di origine. Per i tipi a lunghezza fissa, il risultato è una costante; per i tipi a lunghezza variabile (char, nchar, varcharnvarchar, , binary, ), varbinaryusare la formula precedente. I tipi contrassegnati N/A non possono essere crittografati con Always Encrypted. La tabella seguente contiene un elenco completo dei tipi di dati e della lunghezza del testo crittografato per ogni tipo.

Tipo di dati Lunghezza del testo crittografato [byte]
bigint 65
binary Variabile. Utilizzare la formula precedente.
bit 65
char Variabile. Utilizzare la formula precedente.
date 65
datetime 65
datetime2 65
datetimeoffset 65
decimal 81
float 65
geography N/D (non supportato)
geometry N/D (non supportato)
hierarchyid N/D (non supportato)
Immagine N/D (non supportato)
int 65
money 65
nchar Variabile. Utilizzare la formula precedente.
ntext N/D (non supportato)
numeric 81
nvarchar Variabile. Utilizzare la formula precedente.
real 65
smalldatetime 65
smallint 65
smallmoney 65
sql_variant N/D (non supportato)
sysname N/D (non supportato)
testo N/D (non supportato)
time 65
timestamp

(rowversion)
N/D (non supportato)
tinyint 65
uniqueidentifier 81
varbinary Variabile. Utilizzare la formula precedente.
varchar Variabile. Utilizzare la formula precedente.
xml N/D (non supportato)

Informazioni di riferimento su .NET

Per informazioni dettagliate sugli algoritmi descritti in questo articolo, vedere i file SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs e SqlColumnEncryptionCngProvider.cs nel riferimento .NET.