Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
In dit artikel 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. Deze algoritmen zijn van toepassing op alle edities en versies van Always Encrypted; Zowel Always Encrypted met als zonder beveiligde enclaves gebruiken hetzelfde versleutelingsalgoritmen.
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 (Transact-SQL) voor de huidige lijst met providersCREATE COLUMN MASTER KEY. 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 staat voor geverifieerde versleuteling met gekoppelde gegevens; HMAC staat voor hash-gebaseerde berichtverificatiecode; MAC staat voor berichtverificatiecode.
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
Voor deterministische versleuteling wordt de IV niet willekeurig gegenereerd, maar in plaats daarvan wordt deze afgeleid van de waarde 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
Voor het AEAD_AES_256_CBC_HMAC_SHA_256 algoritme van Always Encrypted wordt na het berekenen van de IV in stap 1 de AES_256_CBC coderingstekst gegenereerd:
aes_256_cbc_ciphertext = AES-CBC-256(enc_key, IV, cell_data) with PKCS7 padding.
Waarbij de versleutelingssleutel (enc_key) als volgt wordt afgeleid van de kolomversleutelingssleutel (CEK):
enc_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell encryption key" + algorithm + CEK_length )
Stap 3: MAC berekenen
Voor het AEAD_AES_256_CBC_HMAC_SHA_256 algoritme van Always Encrypted wordt de MAC (berichtverificatiecode) berekend op basis van de versie-byte, de IV (uit stap 1) en de AES_256_CBC coderingstekst (uit stap 2), met behulp van een mac_key afgeleide van de kolomversleutelingssleutel (CEK):
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
Voor het AEAD_AES_256_CBC_HMAC_SHA_256 algoritme van Always Encrypted wordt de uiteindelijke versleutelde waarde geproduceerd door de byte van het algoritme, de MAC (uit stap 3), de IV (uit stap 1) en de AES_256_CBC coderingstekst (uit stap 2) samen te voegen:
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:
| Onderdeel | Grootte (bytes) |
|---|---|
versionbyte |
1 |
MAC |
32 |
IV |
16 |
aes_256_cbc_ciphertext |
(FLOOR(DATALENGTH(cell_data) / block_size) + 1) * block_size, waarbij block_size 16 bytes zijn en cell_data de waarde voor tekst zonder opmaak is. De minimale grootte is aes_256_cbc_ciphertext één blok (16 bytes). |
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 bytes lange nchar(1000)-waarde met niet-versleutelde tekst wordt na encryptie een 2.065 bytes lange binaire waarde.
De lengte van de coderingstekst is afhankelijk van het gegevenstype van de bron. Voor typen met vaste lengte is het resultaat een constante; voor typen met variabele lengte (char, nchar, varchar, nvarchar, , binary, ), varbinarygebruikt u de bovenstaande formule. Typen die zijn gemarkeerd als N/A , kunnen niet worden versleuteld met Always Encrypted. De volgende tabel bevat een volledige lijst met gegevenstypen en de lengte van coderingstekst voor elk type.
| Gegevenstype | 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 SqlAeadAes256CbcHmac256Algorithm.cs-, SqlColumnEncryptionCertificateStoreProvider.cs- en SqlColumnEncryptionCngProvider.cs-bestanden in de .NET-verwijzing voor meer informatie over de algoritmen die in dit artikel worden besproken.