Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Database SQL di Azure
Istanza 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.