Crittografia sempre attivaAlways Encrypted Cryptography

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Il documento descrive gli algoritmi e i meccanismi di crittografia necessari per derivare il materiale crittografico usato dalla funzionalità Always Encrypted in SQL ServerSQL Server e Database SQL di AzureAzure SQL Database.This document describes encryption algorithms and mechanisms to derive cryptographic material used in the Always Encrypted feature in SQL ServerSQL Server and Database SQL di AzureAzure SQL Database.

Chiavi, archivi di chiavi e algoritmi di crittografia delle chiaviKeys, Key Stores and Key Encryption Algorithms

La funzionalità Crittografia sempre attiva usa chiavi di due tipi: chiavi master della colonna e chiavi di crittografia della colonna.Always Encrypted uses two types of keys: Column master keys and column encryption keys.

La chiave CMK (Column Master Key, chiave master della colonna) è una chiave usata per crittografare altre chiavi che resta sempre sotto il controllo del client ed è memorizzata in un archivio di chiavi esterno.A column master key (CMK) is a key encrypting key (i.e. a key used to encrypt other keys) that is always in client’s control and is stored in an external key store. Il driver client abilitato per Always Encrypted interagisce con l'archivio delle chiavi tramite un provider di archiviazione CMK, che può far parte sia della libreria dei driver (provider MicrosoftMicrosoft/di sistema) che dell'applicazione client (provider personalizzato).An Always Encrypted-enabled client driver interacts with the key store via a CMK store provider, which can be either part of the driver library (a MicrosoftMicrosoft/system provider) or part of the client application (a custom provider). Al momento, le librerie di driver client includono provider di archiviazione chiavi MicrosoftMicrosoft per l'archivio certificati Windows e moduli di protezione hardware.Client driver libraries currently include MicrosoftMicrosoft key store providers for Windows Certificate Store and hardware security modules (HSMs). Per l'elenco aggiornato dei provider, vedere CREATE COLUMN MASTER KEY (Transact-SQL). Uno sviluppatore di applicazioni può realizzare un provider personalizzato per un archivio arbitrario.(For the current list of providers, see CREATE COLUMN MASTER KEY (Transact-SQL).) An application developer can supply a custom provider for an arbitrary store.

La chiave CEK (Column Encryption Key, chiave di crittografia della colonna) è una chiave di crittografia del contenuto, cioè una chiave usata per proteggere i dati, protetta da una chiave CMK.A column encryption key (CEK), is a content encryption key (i.e. a key used to protect data) that is protected by a CMK.

Tutti i provider di archiviazione CMK di MicrosoftMicrosoft eseguono la crittografia delle chiavi CEK con riempimento RSA-OAEP usando i parametri predefiniti specificati nella sezione A.2.1 di RFC 3447.All MicrosoftMicrosoft CMK store providers encrypt CEKs by using RSA with Optimal Asymmetric Encryption Padding (RSA-OAEP) with the default parameters specified by RFC 3447 in Section A.2.1. Tali parametri usano una funzione hash SHA-1 e una funzione di generazione della maschera MGF1 con SHA-1.Those default parameters are using a hash function of SHA-1 and a mask generation function of MGF1 with SHA-1.

Algoritmo di crittografia dei datiData Encryption Algorithm

La funzionalità Always Encrypted usa l'algoritmo AEAD_AES_256_CBC_HMAC_SHA_256 per crittografare i dati nel database.Always Encrypted uses the AEAD_AES_256_CBC_HMAC_SHA_256 algorithm to encrypt data in the database.

AEAD_AES_256_CBC_HMAC_SHA_256 deriva dalla bozza della specifica disponibile all'indirizzo http://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05.AEAD_AES_256_CBC_HMAC_SHA_256 is derived from the specification draft at http://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05. L’algoritmo usa uno schema di crittografia autenticata con dati associati che adotta l’approccio Encrypt-then-MAC.It uses an Authenticated Encryption scheme with Associated Data, following an Encrypt-then-MAC approach. Tale approccio prevede prima la crittografia del testo non crittografato e quindi la generazione del MAC in base al testo crittografato risultante.That is, the plaintext is first encrypted, and the MAC is produced based on the resulting ciphertext.

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).In order to conceal patterns, AEAD_AES_256_CBC_HMAC_SHA_256 uses the Cipher Block Chaining (CBC) mode of operation, where an initial value is fed into the system named the initialization vector (IV). La descrizione completa della modalità CBC è disponibile all'indirizzo http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.The full description of the CBC mode can be found at http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.

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.AEAD_AES_256_CBC_HMAC_SHA_256 computes a ciphertext value for a given plaintext value using the following steps.

Passaggio 1: Generare il vettore di inizializzazione (IV)Step 1: Generating the initialization vector (IV)

La funzionalità Always Encrypted supporta due varianti di AEAD_AES_256_CBC_HMAC_SHA_256:Always Encrypted supports two variations of AEAD_AES_256_CBC_HMAC_SHA_256:

  • CasualeRandomized

  • DeterministicoDeterministic

    Nella crittografia casuale l’IV viene generato in modo casuale.For randomized encryption, the IV is randomly generated. Di conseguenza, quando viene crittografato lo stesso testo non crittografato, viene generato un testo crittografato diverso, impedendo così l'intercettazione delle informazioni.As a result, each time the same plaintext is encrypted, a different ciphertext is generated, which prevents any information disclosure.

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

Nella crittografia deterministica l’IV non è generato casualmente ma derivato dal valore del testo non crittografato usando l'algoritmo seguente:In the case of deterministic encryption, the IV is not randomly generated, but instead it is derived from the plaintext value using the following algorithm:

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:Where iv_key is derived from the CEK in the following way:

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

Il troncamento del valore HMAC viene eseguito per riempire 1 blocco di dati come necessario per IV.The HMAC value truncation is performed in order to fit 1 block of data as needed for the IV.
Di conseguenza, la crittografia deterministica genera sempre lo stesso testo crittografato per i valori di un determinato testo non crittografato, consentendo l'inferenza se due valori di testo non crittografato sono uguali rispetto ai relativi valori del testo crittografato.As a result, deterministic encryption always produces the same ciphertext for a given plaintext values, which enables inferring whether two plaintext values are equal by comparing their corresponding ciphertext values. Questa limitata intercettazione delle informazioni consente al sistema di database di supportare il confronto delle uguaglianze per i valori delle colonne crittografate.This limited information disclosure allows the database system to support equality comparison on encrypted column values.

La crittografia deterministica è più efficace nel nascondere i modelli rispetto ad alternative quali, ad esempio, l’uso di un valore IV predefinito.Deterministic encryption is more effective in concealing patterns, compared to alternatives, such as using a pre-defined IV value.

Passaggio 2: Calcolo del testo crittografato AES_256_CBCStep 2: Computing AES_256_CBC Ciphertext

Dopo avere calcolato l'IV viene generato il testo crittografato AES_256_CBC :After computing the IV, the AES_256_CBC ciphertext is generated:

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 CEK come segue.Where the encryption key (enc_key) is derived from the CEK as follows.

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

Passaggio 3: Calcolo del MACStep 3: Computing MAC

Successivamente, il MAC viene calcolato con l'algoritmo seguente:Subsequently, the MAC is computed using the following algorithm:

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

Dove:Where:

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

Passaggio 4: ConcatenazioneStep 4: Concatenation

Infine, il valore crittografato è generato concatenando il byte della versione dell’algoritmo, il MAC, l’IV e il testo crittografato AES_256_CBC:Finally, the encrypted value is produced by simply concatenating the algorithm version byte, the MAC, the IV and the AES_256_CBC ciphertext:

aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext  

Lunghezza del testo crittografatoCiphertext Length

La lunghezza in byte dei singoli componenti del testo crittografato AEAD_AES_256_CBC_HMAC_SHA_256 è:The lengths (in bytes) of particular components of AEAD_AES_256_CBC_HMAC_SHA_256 ciphertext are:

  • versionbyte: 1versionbyte: 1

  • MAC: 32MAC: 32

  • IV: 16IV: 16

  • aes_256_cbc_ciphertext: (FLOOR (DATALENGTH(cell_data)/ block_size) + 1)* block_size, dove:aes_256_cbc_ciphertext: (FLOOR (DATALENGTH(cell_data)/ block_size) + 1)* block_size, where:

    • block_size è pari a 16 byteblock_size is 16 bytes

    • cell_data è un valore di testo non crittografatocell_data is a plaintext value

      Pertanto la dimensione minima di aes_256_cbc_ciphertext è 1 blocco, pari a 16 byte.Therefore, the minimal size of aes_256_cbc_ciphertext is 1 block, which is 16 bytes.

    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:Thus, the length of ciphertext, resulting from encrypting a given plaintext values (cell_data), can be calculated using the following formula:

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

Esempio:For example:

  • Dopo la crittografia, un valore di testo non crittografato int lungo 4 byte diventa un valore binario lungo 65 byte.A 4-byte long int plaintext value becomes a 65-byte long binary value after encryption.

  • Un valore di testo non crittografato nchar(1000) lungo 2.000 byte diventa un valore binario lungo 2.065 byte.A 2,000-byte long nchar(1000) plaintext values becomes a 2,065-byte long binary value after encryption.

    La tabella seguente contiene un elenco completo dei tipi di dati e della lunghezza del testo crittografato per ogni tipo.The following table contains a complete list of data types and the length of ciphertext for each type.

Tipo di datiData Type Lunghezza del testo crittografato [byte]Ciphertext Length [bytes]
bigintbigint 6565
binarybinary Variabile.Varies. Utilizzare la formula precedente.Use the formula above.
bitbit 6565
charchar Variabile.Varies. Utilizzare la formula precedente.Use the formula above.
datadate 6565
datetimedatetime 6565
datetime2datetime2 6565
datetimeoffsetdatetimeoffset 6565
decimaldecimal 8181
floatfloat 6565
geographygeography N/D (non supportato)N/A (not supported)
geometrygeometry N/D (non supportato)N/A (not supported)
hierarchyidhierarchyid N/D (non supportato)N/A (not supported)
imageimage N/D (non supportato)N/A (not supported)
intint 6565
moneymoney 6565
ncharnchar Variabile.Varies. Utilizzare la formula precedente.Use the formula above.
ntextntext N/D (non supportato)N/A (not supported)
numericnumeric 8181
nvarcharnvarchar Variabile.Varies. Utilizzare la formula precedente.Use the formula above.
realreal 6565
smalldatetimesmalldatetime 6565
smallintsmallint 6565
smallmoneysmallmoney 6565
sql_variantsql_variant N/D (non supportato)N/A (not supported)
sysnamesysname N/D (non supportato)N/A (not supported)
texttext N/D (non supportato)N/A (not supported)
timetime 6565
timestamptimestamp

(rowversion)(rowversion)
N/D (non supportato)N/A (not supported)
tinyinttinyint 6565
uniqueidentifieruniqueidentifier 8181
varbinaryvarbinary Variabile.Varies. Utilizzare la formula precedente.Use the formula above.
varcharvarchar Variabile.Varies. Utilizzare la formula precedente.Use the formula above.
xmlxml N/D (non supportato)N/A (not supported)

Guida di riferimento a .NET.NET Reference

Per altre informazioni sugli algoritmi illustrati in questo documento, vedere i file SqlAeadAes256CbcHmac256Algorithm.cs e SqlColumnEncryptionCertificateStoreProvider.cs della Guida di riferimento a .NET.For details about the algorithms, discussed in this document, see the SqlAeadAes256CbcHmac256Algorithm.cs and SqlColumnEncryptionCertificateStoreProvider.cs files in the .NET Reference.

Vedere ancheSee Also

Always Encrypted (Motore di database) Always Encrypted (Database Engine)
Always Encrypted (client development) (Always Encrypted - sviluppo client) Always Encrypted (client development)