Delen via


Altijd versleutelde cryptografie

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

In dit document worden versleutelingsalgoritmen en -mechanismen beschreven voor het afleiden van cryptografisch materiaal dat wordt gebruikt in de functie Always Encrypted in SQL Server en Azure SQL Database.

Sleutels, sleutelarchieven en sleutelversleutelingsalgoritmen

Always Encrypted maakt gebruik van twee typen sleutels: kolomhoofdsleutels en kolomversleutelingssleutels.

Een kolomhoofdsleutel (CMK) is een sleutel voor het versleutelen van sleutels (bijvoorbeeld een sleutel die wordt gebruikt om andere sleutels te versleutelen) die altijd in het besturingselement van een client staat en wordt opgeslagen in een extern sleutelarchief. Een clientstuurprogramma met Always Encrypted communiceert met het sleutelarchief via een CMK-archiefprovider, die deel kan uitmaken van de stuurprogrammabibliotheek (een Microsoft/systeemprovider) of een deel van de clienttoepassing (een aangepaste provider). Clientstuurprogrammabibliotheken omvatten momenteel Microsoft-sleutelarchiefproviders voor Windows Certificate Store en HSM's (Hardware Security Modules). Zie CREATE COLUMN MASTER KEY (Transact-SQL) voor de huidige lijst met providers. Een toepassingsontwikkelaar kan een aangepaste provider leveren voor een willekeurige winkel.

Een kolomversleutelingssleutel (CEK) is een versleutelingssleutel voor inhoud (bijvoorbeeld een sleutel die wordt gebruikt om gegevens te beveiligen) die wordt beveiligd door een CMK.

Alle Microsoft CMK-opslagproviders versleutelen CEK's met behulp van RSA met Optimal Asymmetric Encryption Padding (RSA-OAEP). De sleutelarchiefprovider die ondersteuning biedt voor De Cryptografie-API van Microsoft: Next Generation (CNG) in .NET Framework (SqlColumnEncryptionCngProvider Class) gebruikt de standaardparameters die zijn opgegeven door RFC 8017 in sectie A.2.1. Deze standaardparameters maken gebruik van een hash-functie van SHA-1 en een maskergenereerfunctie van MGF1 met SHA-1. Alle andere sleutelbeheerders gebruiken SHA-256.

Always Encrypted maakt intern gebruik van door FIPS 140-2 gevalideerde cryptografische modules.

Algoritme voor gegevensversleuteling

Always Encrypted maakt gebruik van het AEAD_AES_256_CBC_HMAC_SHA_256-algoritme om gegevens in de database te versleutelen.

AEAD_AES_256_CBC_HMAC_SHA_256 is afgeleid van het concept van de IETF-specificatie. Het maakt gebruik van een geauthenticeerd versleutelingsschema met gekoppelde gegevens, volgens een Encrypt-then-MAC-benadering. Dat wil gezegd, de tekst zonder opmaak wordt eerst versleuteld en de MAC wordt geproduceerd op basis van de resulterende coderingstekst.

Om patronen te verbergen, gebruikt AEAD_AES_256_CBC_HMAC_SHA_256 de CBC-modus (Cipher Block Chaining), waarbij een initiële waarde wordt ingevoerd in het systeem met de naam initialisatievector (IV). De volledige beschrijving van de CBC-modus vindt u bij het Amerikaanse National Institute of Standards and Technology (NIST).

AEAD_AES_256_CBC_HMAC_SHA_256 berekent een coderingstekstwaarde voor een bepaalde waarde voor tekst zonder opmaak met behulp van de volgende stappen.

Stap 1: De initialisatievector (IV) genereren

Always Encrypted ondersteunt twee variaties van AEAD_AES_256_CBC_HMAC_SHA_256:

  • Gerandomiseerde

  • Deterministisch

Voor gerandomiseerde versleuteling wordt de IV willekeurig gegenereerd. Als gevolg hiervan wordt telkens wanneer dezelfde tekst zonder opmaak wordt versleuteld, een andere coderingstekst gegenereerd, waardoor openbaarmaking van informatie wordt voorkomen.

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

Als er deterministische versleuteling is, wordt de IV niet willekeurig gegenereerd, maar in plaats daarvan wordt deze afgeleid van de waarde voor tekst zonder opmaak met behulp van het volgende algoritme:

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

Wanneer iv_key op de volgende manier wordt afgeleid van de CEK:

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

De afkapping van de HMAC-waarde wordt uitgevoerd om in één gegevensblok te passen, zoals nodig voor de IV. Als gevolg hiervan produceert deterministische versleuteling altijd dezelfde coderingstekst voor een bepaalde waarde voor tekst zonder opmaak, waardoor kan worden uitgesteld of twee waarden voor tekst zonder opmaak gelijk zijn door de bijbehorende coderingstekstwaarden te vergelijken. Dankzij deze beperkte openbaarmaking van informatie kan het databasesysteem gelijkheidsvergelijking voor versleutelde kolomwaarden ondersteunen.

Deterministische versleuteling is effectiever bij het verbergen van patronen, vergeleken met alternatieven, zoals het gebruik van een vooraf gedefinieerde IV-waarde.

Stap 2: AES_256_CBC coderingstekst berekenen

Na het berekenen van de IV wordt de AES_256_CBC ciphertext gegenereerd:

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

Waar de versleutelingssleutel (enc_key) als volgt wordt afgeleid van de CEK.

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

Stap 3: MAC berekenen

Vervolgens wordt de MAC berekend met behulp van het volgende algoritme:

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

Where:

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

Stap 4: Samenvoeging

Ten slotte wordt de versleutelde waarde geproduceerd door het samenvoegen van de algoritmeversie byte, de MAC, de IV en de AES_256_CBC coderingstekst:

aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext  

Lengte van coderingstekst

De lengten (in bytes) van bepaalde onderdelen van AEAD_AES_256_CBC_HMAC_SHA_256 coderingstekst zijn:

  • versionbyte: 1

  • MAC: 32

  • IV: 16

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

    • blokgrootte is 16 bytes

    • cell_data is een platte tekstwaarde

    Daarom is de minimale grootte van aes_256_cbc_ciphertext 1 blok, dat 16 bytes is.

De lengte van coderingstekst, die het gevolg is van het versleutelen van een bepaalde waarden voor tekst zonder opmaak (cell_data), kan dus worden berekend met behulp van de volgende formule:

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

Voorbeeld:

  • Een 4-byte lange int plaintext-waarde wordt een binaire waarde van 65 bytes na versleuteling.

  • Een 2.000-byte lange nchar(1000) plaintext-waarde wordt na versleuteling een binaire waarde van 2.065 bytes.

De volgende tabel bevat een volledige lijst met gegevenstypen en de lengte van coderingstekst voor elk type.

Gegevenssoort Lengte van coderingstekst [bytes]
bigint 65
binary Varieert. Gebruik de bovenstaande formule.
bit 65
teken Varieert. Gebruik de bovenstaande formule.
date 65
datetime 65
datetime2 65
datetimeoffset 65
decimal 81
float 65
geography N/B (niet ondersteund)
geometry N/B (niet ondersteund)
hierarchyid N/B (niet ondersteund)
image N/B (niet ondersteund)
int 65
geld 65
nchar Varieert. Gebruik de bovenstaande formule.
ntext N/B (niet ondersteund)
numeriek 81
nvarchar Varieert. Gebruik de bovenstaande formule.
echte 65
smalldatetime 65
smallint 65
kleingeld 65
sql_variant N/B (niet ondersteund)
sysname N/B (niet ondersteund)
tekst N/B (niet ondersteund)
time 65
tijdstempel

(rowversion)
N/B (niet ondersteund)
tinyint 65
uniqueidentifier 81
varbinary Varieert. Gebruik de bovenstaande formule.
varchar Varieert. Gebruik de bovenstaande formule.
xml N/B (niet ondersteund)

.NET-referentie

Zie de bestanden SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs en SqlColumnEncryptionCertificateStoreProvider.cs in de .NET-verwijzing voor meer informatie over de algoritmen die in dit document worden besproken.

Zie ook