Always Encrypted-KryptografieAlways Encrypted cryptography

Gilt für: JaSQL Server JaAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Dieses Dokument beschreibt Verschlüsselungsalgorithmen und -mechanismen zum Ableiten von kryptografischem Material, das in der Funktion Always Encrypted in SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Databaseverwendet wird.This document describes encryption algorithms and mechanisms to derive cryptographic material used in the Always Encrypted feature in SQL ServerSQL Server and Azure SQL-DatenbankAzure SQL Database.

Schlüssel, Schlüsselspeicher und Algorithmen für die SchlüsselverschlüsselungKeys, key stores, and key encryption algorithms

Always Encrypted nutzt zwei Arten von Schlüsseln: Spaltenhauptschlüssel und Spaltenverschlüsselungsschlüssel.Always Encrypted uses two types of keys: Column master keys and column encryption keys.

Ein Spaltenhauptschlüssel (Column Master Key; CMK) ist ein Schlüsselverschlüsselungsschlüssel (d. h. ein Schlüssel zum Verschlüsseln anderer Schlüssel), der sich immer unter der Kontrolle eines Clients befindet und in einem externen Schlüsselspeicher gespeichert ist.A column master key (CMK) is a key encrypting key (for example, a key that is used to encrypt other keys) that is always in a client's control, and is stored in an external key store. Ein Clienttreiber, der für Always Encrypted aktiviert ist, interagiert mit dem Schlüsselspeicher über einen CMK-Speicheranbieter, der entweder Teil der Treiberbibliothek (ein MicrosoftMicrosoft-/Systemanbieter) oder Teil der Clientanwendung (ein benutzerdefinierter Anbieter) ist.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). Clienttreiberbibliotheken umfassen derzeit MicrosoftMicrosoft -Schlüsselspeicheranbieter für Windows-Zertifikatspeicher und Hardwaresicherheitsmodule (HSMs).Client driver libraries currently include MicrosoftMicrosoft key store providers for Windows Certificate Store and hardware security modules (HSMs). Eine aktuelle Liste der Anbieter finden Sie unter CREATE COLUMN MASTER KEY (Transact-SQL).For the current list of providers, see CREATE COLUMN MASTER KEY (Transact-SQL). Ein Anwendungsentwickler kann einen benutzerdefinierten Anbieter für einen beliebigen Speicher angeben.An application developer can supply a custom provider for an arbitrary store.

Ein Spaltenverschlüsselungsschlüssel (column encryption key; CEK) ist ein Inhaltsverschlüsselungsschlüssel (d.h. ein Schlüssel zum Schützen von Daten), der durch einen CMK geschützt ist.A column encryption key (CEK), is a content encryption key (for example, a key that is used to protect data) that is protected by a CMK.

Alle MicrosoftMicrosoft-CMK-Speicheranbieter verschlüsseln CEKs, indem sie RSA-OAEP (RSA mit optimalem asymmetrischen Verschlüsselungspadding) verwenden.All MicrosoftMicrosoft CMK store providers encrypt CEKs by using RSA with Optimal Asymmetric Encryption Padding (RSA-OAEP). Der Schlüsselspeicheranbieter, der die Microsoft Cryptography API unterstützt: Next Generation (CNG) in .NET Framework (SqlColumnEncryptionCngProvider-Klasse) verwendet dich von RFC 8017 in Abschnitt A.2.1 angegeben StandardparameterThe key store provider that supports Microsoft Cryptography API: Next Generation (CNG) in .NET Framework (SqlColumnEncryptionCngProvider Class) uses the default parameters specified by RFC 8017 in Section A.2.1. Diese Standardparameter verwenden eine Hashfunktion von SHA-1 und eine Maskengenerierungsfunktion von MGF1 mit SHA-1.Those default parameters are using a hash function of SHA-1 and a mask generation function of MGF1 with SHA-1. Alle anderen Schlüsselspeicheranbieter verwenden SHA-256.All other key store providers use SHA-256.

DatenverschlüsselungsalgorithmusData Encryption Algorithm

Always Encrypted verwendet den Algorithmus AEAD_AES_256_CBC_HMAC_SHA_256 zum Verschlüsseln von Daten in der Datenbank.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 wird vom Spezifikationsentwurf unter https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05 abgeleitet.AEAD_AES_256_CBC_HMAC_SHA_256 is derived from the specification draft at https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05. Er verwendet ein authentifiziertes Verschlüsselungsschema mit zugeordneten Daten nach einem Encrypt-then-MAC-Ansatz.It uses an Authenticated Encryption scheme with Associated Data, following an Encrypt-then-MAC approach. D.h. zunächst wird der Klartext verschlüsselt, und anschließend wird der MAC basierend auf dem resultierenden Chiffretext erstellt.That is, the plaintext is first encrypted, and the MAC is produced based on the resulting ciphertext.

Um Muster zu verbergen, verwendet AEAD_AES_256_CBC_HMAC_SHA_256 den Betriebsmodus der Blockchiffreverkettung (Cipher Block Chaining, CBC), in dem ein Anfangswert in das System eingegeben wird, der als Initialisierungsvektor (IV) bezeichnet wird.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). Eine vollständige Beschreibung des CBC-Modus finden Sie unter https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.The full description of the CBC mode can be found at https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.

AEAD_AES_256_CBC_HMAC_SHA_256 berechnet einen Chiffretextwert für einen angegebenen Klartextwert mithilfe der folgenden Schritte.AEAD_AES_256_CBC_HMAC_SHA_256 computes a ciphertext value for a given plaintext value using the following steps.

Schritt 1: Generieren des Initialisierungsvektors (IV)Step 1: Generating the initialization vector (IV)

Always Encrypted unterstützt zwei Variationen von AEAD_AES_256_CBC_HMAC_SHA_256:Always Encrypted supports two variations of AEAD_AES_256_CBC_HMAC_SHA_256:

  • ZufälligRandomized

  • DeterministischDeterministic

Für die zufällige Verschlüsselung wird der IV zufällig generiert.For randomized encryption, the IV is randomly generated. Daher wird jedes Mal, wenn der gleiche Klartext verschlüsselt wird, ein anderer Chiffretext generiert, was jegliche Offenlegung von Informationen verhindert.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  

Bei der deterministischen Verschlüsselung wird der IV nicht zufällig generiert, sondern mithilfe des folgenden Algorithmus aus dem Klartextwert abgeleitet:If there's deterministic encryption, the IV isn't randomly generated, but instead it's 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.  

Wobei iv_key vom CEK folgendermaßen abgeleitet wird: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)  

Das Abschneiden des HMAC-Werts wird ausgeführt, um einen Block von Daten wie für den IV benötigt anzupassen.The HMAC value truncation is performed to fit one block of data as needed for the IV. Daher erzeugt die deterministische Verschlüsselung immer den gleichen Chiffretext für einen angegebenen Klartextwert. Dadurch kann aus einem Vergleich der entsprechenden Chiffretextwerte abgeleitet werden, ob zwei Klartexte identisch sind.As a result, deterministic encryption always produces the same ciphertext for a given plaintext value, which enables inferring whether two plaintext values are equal by comparing their corresponding ciphertext values. Diese eingeschränkte Offenlegung von Informationen ermöglicht dem Datenbanksystem das Unterstützen der Gleichheitsüberprüfung von verschlüsselten Datenwerten.This limited information disclosure allows the database system to support equality comparison on encrypted column values.

Die deterministische Verschlüsselung ist im Vergleich zu Alternativen, wie der Verwendung von vordefinierten IV-Werten, effektiver im Verdecken von Mustern.Deterministic encryption is more effective in concealing patterns, compared to alternatives, such as using a pre-defined IV value.

Schritt 2: Berechnen des Chiffretexts „AES_256_CBC“Step 2: Computing AES_256_CBC Ciphertext

Nach dem Berechnen des IV-Werts wird der Chiffretext AES_256_CBC generiert: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.  

Wobei der Verschlüsselungsschlüssel (enc_key) vom CEK folgendermaßen abgeleitet wird.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 )  

Schritt 3: Berechnen des MACStep 3: Computing MAC

Anschließend wird der MAC mithilfe des folgenden Algorithmus berechnet:Subsequently, the MAC is computed using the following algorithm:

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

Hierbei gilt:Where:

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

Schritt 4: VerkettungStep 4: Concatenation

Schließlich wird der verschlüsselte Wert erzeugt, indem das Algorithmusversionsbyte, der MAC, der IV und der Chiffretext „AES_256_CBC“ verkettet werden:Finally, the encrypted value is produced by 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  

ChiffretextlängeCiphertext Length

Die Längen (in Bytes) bestimmter Komponenten des Chiffretexts AEAD_AES_256_CBC_HMAC_SHA_256 lauten wie folgt:The lengths (in bytes) of particular components of AEAD_AES_256_CBC_HMAC_SHA_256 ciphertext are:

  • Versionsbyte: 1versionbyte: 1

  • MAC: 32MAC: 32

  • IV: 16IV: 16

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

    • block_size 16 Byte beträgtblock_size is 16 bytes

    • cell_data ein Klartextwert istcell_data is a plaintext value

    Daher ist die minimale Größe des aes_256_cbc_ciphertext 1 Block, der 16 Byte groß ist.Therefore, the minimal size of aes_256_cbc_ciphertext is 1 block, which is 16 bytes.

Daher kann die Länge des Chiffretexts, die sich aus der Verschlüsselung bestimmter Klartextwerte (cell_data) ergibt, mithilfe der folgenden Formel berechnet werden: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  

Beispiel:For example:

  • Ein 4 Bytes langer int -Klartextwert wird nach der Verschlüsselung zu einem 65 Bytes langen Binärwert.A 4-byte long int plaintext value becomes a 65-byte long binary value after encryption.

  • Ein 2000 Bytes langer nchar(1000) -Klartextwert wird nach der Verschlüsselung zu einem 2065 Bytes langen Binärwert.A 2,000-byte long nchar(1000) plaintext values becomes a 2,065-byte long binary value after encryption.

Die folgende Tabelle enthält eine vollständige Liste der Datentypen und Längen der Chiffretexte für jeden Typ.The following table contains a complete list of data types and the length of ciphertext for each type.

DatentypData Type Chiffretextlänge [Bytes]Ciphertext Length [bytes]
bigintbigint 6565
binarybinary Verschiedene Ursachen.Varies. Verwenden Sie die oben stehende Formel.Use the formula above.
bitbit 6565
charchar Verschiedene Ursachen.Varies. Verwenden Sie die oben stehende Formel.Use the formula above.
datedate 6565
datetimedatetime 6565
datetime2datetime2 6565
datetimeoffsetdatetimeoffset 6565
decimaldecimal 8181
floatfloat 6565
geographygeography N/V (nicht unterstützt)N/A (not supported)
geometrygeometry N/V (nicht unterstützt)N/A (not supported)
hierarchyidhierarchyid N/V (nicht unterstützt)N/A (not supported)
imageimage N/V (nicht unterstützt)N/A (not supported)
intint 6565
moneymoney 6565
ncharnchar Verschiedene Ursachen.Varies. Verwenden Sie die oben stehende Formel.Use the formula above.
ntextntext N/V (nicht unterstützt)N/A (not supported)
numericnumeric 8181
nvarcharnvarchar Verschiedene Ursachen.Varies. Verwenden Sie die oben stehende Formel.Use the formula above.
realreal 6565
smalldatetimesmalldatetime 6565
smallintsmallint 6565
smallmoneysmallmoney 6565
sql_variantsql_variant N/V (nicht unterstützt)N/A (not supported)
sysnamesysname N/V (nicht unterstützt)N/A (not supported)
texttext N/V (nicht unterstützt)N/A (not supported)
timetime 6565
timestamptimestamp

(rowversion)(rowversion)
N/V (nicht unterstützt)N/A (not supported)
tinyinttinyint 6565
uniqueidentifieruniqueidentifier 8181
varbinaryvarbinary Verschiedene Ursachen.Varies. Verwenden Sie die oben stehende Formel.Use the formula above.
varcharvarchar Verschiedene Ursachen.Varies. Verwenden Sie die oben stehende Formel.Use the formula above.
xmlxml N/V (nicht unterstützt)N/A (not supported)

.NET-Referenz.NET Reference

Weitere Informationen zu den in diesem Dokument beschriebenen Algorithmen finden Sie in der .NET-Referenz in den Dateien SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs und SqlColumnEncryptionCertificateStoreProvider.cs.For details about the algorithms, discussed in this document, see the SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs, and SqlColumnEncryptionCertificateStoreProvider.cs files in the .NET Reference.

Weitere InformationenSee Also