Always Encrypted-kryptografi

gäller för:SQL ServerAzure SQL DatabaseAzure 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.

Se även