Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Det här dokumentet beskriver krypteringsalgoritmer och mekanismer för att härleda kryptografiskt material som används i funktionen Always Encrypted i SQL Server och Azure SQL Database.
Algoritmer för nycklar, nyckellager och nyckelkryptering
Always Encrypted använder två typer av nycklar: Kolumnhuvudnycklar och kolumnkrypteringsnycklar.
En kolumnhuvudnyckel (CMK) är en nyckelkrypteringsnyckel (till exempel en nyckel som används för att kryptera andra nycklar) som alltid finns i en klients kontroll och lagras i ett externt nyckelarkiv. En klientdrivrutin som är Always Encrypted-aktiverad interagerar med nyckellagringen via en CMK-tjänsteleverantör, som antingen kan vara en del av drivrutinsbiblioteket (en Microsoft/systemleverantör) eller en del av klientprogrammet (en anpassad leverantör). Klientdrivrutinsbibliotek innehåller för närvarande Microsofts nyckellagringsleverantörer för Windows Certificate Store och maskinvarusäkerhetsmoduler (HSM). Den aktuella listan över leverantörer finns i CREATE COLUMN MASTER KEY (Transact-SQL). En applikationsutvecklare kan tillhandahålla en anpassad leverantör för en godtycklig butik.
En kolumnkrypteringsnyckel (CEK) är en innehållskrypteringsnyckel (till exempel en nyckel som används för att skydda data) som skyddas av en CMK.
Alla Microsoft CMK-butiksleverantörer krypterar CEK:er med hjälp av RSA med optimal asymmetrisk krypteringsutfyllnad (RSA-OAEP). Nyckellagringsprovidern som stöder Microsoft Cryptography API: Next Generation (CNG) i .NET Framework (SqlColumnEncryptionCngProvider Class) använder standardparametrarna som anges av RFC 8017 i avsnitt A.2.1. Dessa standardparametrar använder en hashfunktion av SHA-1 och en maskgenereringsfunktion för MGF1 med SHA-1. Alla andra nyckellagringsleverantörer använder SHA-256.
Always Encrypted använder FIPS 140-2-verifierade kryptografiska moduler internt.
Algoritm för datakryptering
Always Encrypted använder AEAD_AES_256_CBC_HMAC_SHA_256-algoritmen för att kryptera data i databasen.
AEAD_AES_256_CBC_HMAC_SHA_256 härleds från specifikationsutkastet på https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05. Den använder ett autentiserat krypteringsschema med associerade data, enligt metoden Encrypt-then-MAC. Det innebär att klartexten först krypteras och MAC skapas baserat på den resulterande chiffertexten.
För att dölja mönster använder AEAD_AES_256_CBC_HMAC_SHA_256 CBC-läget (Cipher Block Chaining), där ett initialt värde matas in i systemet med namnet initieringsvektorn (IV). Den fullständiga beskrivningen av CBC-läget finns på https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.
AEAD_AES_256_CBC_HMAC_SHA_256 beräknar ett chiffertextvärde för ett angivet klartextvärde med hjälp av följande steg.
Steg 1: Generera initieringsvektorn (IV)
Always Encrypted stöder två varianter av AEAD_AES_256_CBC_HMAC_SHA_256:
Randomiserad
Deterministisk
För randomiserad kryptering genereras IV slumpmässigt. Varje gång samma klartext krypteras genereras därför en annan chiffertext, vilket förhindrar att information avslöjas.
When using randomized encryption: IV = Generate cryptographically random 128bits
Om det finns deterministisk kryptering genereras inte IV slumpmässigt, utan härleds i stället från klartextvärdet med hjälp av följande algoritm:
When using deterministic encryption: IV = HMAC-SHA-256( iv_key, cell_data ) truncated to 128 bits.
Där iv_key härleds från CEK på följande sätt:
iv_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell IV key" + algorithm + CEK_length)
HMAC-värdetrunkeringen utförs för att passa ett datablock efter behov för IV. Därför genererar deterministisk kryptering alltid samma chiffertext för ett givet klartextvärde, vilket gör det möjligt att avgöra om två klartextvärden är lika genom att jämföra motsvarande chiffertextvärden. Detta begränsade informationslämnande gör det möjligt för databassystemet att stödja likhetsjämförelse på krypterade kolumnvärden.
Deterministisk kryptering är effektivare när det gäller att dölja mönster, jämfört med alternativ, till exempel att använda ett fördefinierat IV-värde.
Steg 2: Beräkning AES_256_CBC chiffertext
Efter databehandling av IV genereras AES_256_CBC chiffertext:
aes_256_cbc_ciphertext = AES-CBC-256(enc_key, IV, cell_data) with PKCS7 padding.
Där krypteringsnyckeln (enc_key) härleds från CEK enligt följande.
enc_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell encryption key" + algorithm + CEK_length )
Steg 3: Beräkna MAC
Därefter beräknas MAC med hjälp av följande algoritm:
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)
Steg 4: Sammanlänkning
Slutligen skapas det krypterade värdet genom att algoritmversionsbyte sammanfogas, MAC, IV och AES_256_CBC chiffertext:
aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext
Chiffertextlängd
Längden (i byte) på vissa komponenter i AEAD_AES_256_CBC_HMAC_SHA_256 chiffertext är:
versionbyte: 1
MAC: 32
IV: 16
aes_256_cbc_ciphertext:
(FLOOR (DATALENGTH(cell_data)/ block_size) + 1)* block_size, där:block_size är 16 byte
cell_data är ett klartextvärde
Därför är den minimala storleken på aes_256_cbc_ciphertext 1 block, vilket är 16 byte.
Därför kan längden på chiffertexten, som beror på kryptering av ett angivet klartextvärde (cell_data), beräknas med hjälp av följande formel:
1 + 32 + 16 + (FLOOR(DATALENGTH(cell_data)/16) + 1) * 16
Till exempel:
Ett 4 byte långt int-klartextvärde blir ett 65 byte långt binärt värde efter kryptering.
Ett 2 000 byte långt nchar(1 000) klartextvärden blir ett 2 065 byte långt binärt värde efter kryptering.
Följande tabell innehåller en fullständig lista över datatyper och längden på chiffertexten för varje typ.
| Datatyp | Chiffertextlängd [byte] |
|---|---|
| bigint | 65 |
| binary | Varierar. Använd formeln ovan. |
| bit | 65 |
| tecken | Varierar. Använd formeln ovan. |
| date | 65 |
| datetime | 65 |
| datetime2 | 65 |
| datetimeoffset | 65 |
| decimal | 81 |
| float | 65 |
| geography | N/A (stöds inte) |
| geometry | N/A (stöds inte) |
| hierarchyid | N/A (stöds inte) |
| image | N/A (stöds inte) |
| int | 65 |
| pengar | 65 |
| nchar | Varierar. Använd formeln ovan. |
| ntext | N/A (stöds inte) |
| numerisk | 81 |
| nvarchar | Varierar. Använd formeln ovan. |
| riktiga | 65 |
| smalldatetime | 65 |
| smallint | 65 |
| småpengar | 65 |
| sql_variant | N/A (stöds inte) |
| sysname | N/A (stöds inte) |
| text | N/A (stöds inte) |
| time | 65 |
|
Tidsstämpel (rowversion) |
N/A (stöds inte) |
| tinyint | 65 |
| uniqueidentifier | 81 |
| varbinary | Varierar. Använd formeln ovan. |
| varchar | Varierar. Använd formeln ovan. |
| xml | N/A (stöds inte) |
.NET-referens
Mer information om algoritmerna som beskrivs i det här dokumentet finns i SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs och SqlColumnEncryptionCertificateStoreProvider.cs filer i .NET-referensen.