Sdílet prostřednictvím


Kryptografie "Always Encrypted"

platí pro: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Tento dokument popisuje šifrovací algoritmy a mechanismy pro odvození kryptografického materiálu používaného ve funkci Always Encrypted v SQL Serveru a Azure SQL Database.

Klíče, úložiště klíčů a šifrovací algoritmy klíčů

Funkce Always Encrypted používá dva typy klíčů: mistrovské klíče sloupců a šifrovací klíče sloupců.

Sloupcový hlavní klíč (CMK) je klíč pro šifrování klíče (například klíč, který se používá k šifrování dalších klíčů), který je vždy pod kontrolou klienta a je uložen v externím úložišti klíčů. Klientský ovladač s podporou Always Encrypted komunikuje s úložištěm klíčů prostřednictvím poskytovatele úložiště CMK, který může být součástí knihovny ovladačů (microsoft/systémový poskytovatel) nebo součástí klientské aplikace (vlastního poskytovatele). Klientské knihovny ovladačů aktuálně zahrnují poskytovatele úložiště klíčů Microsoftu pro Windows Certificate Store a moduly hardwarového zabezpečení (HSM). Aktuální seznam zprostředkovatelů najdete v tématu CREATE COLUMN MASTER KEY (Transact-SQL). Vývojář aplikace může zadat vlastního poskytovatele pro libovolné úložiště.

Šifrovací klíč sloupce (CEK) je šifrovací klíč obsahu (například klíč, který slouží k ochraně dat), který je chráněný klíčem CMK.

Všichni poskytovatelé úložiště Microsoft CMK šifrují šifrovací klíče obsahu pomocí RSA s optimálním asymetrickým odsazením šifrování (RSA-OAEP). Zprostředkovatel úložiště klíčů, který podporuje rozhraní Microsoft Cryptography API: Next Generation (CNG) v rozhraní .NET Framework (SqlColumnEncryptionCngProvider – třída) používá výchozí parametry určené rfC 8017 v oddílu A.2.1. Tyto výchozí parametry používají funkci hash SHA-1 a funkci generování masky MGF1 s SHA-1. Všichni ostatní poskytovatelé úložiště klíčů používají SHA-256.

Funkce Always Encrypted interně používá kryptografické moduly ověřené protokolem FIPS 140-2.

Algoritmus šifrování dat

Funkce Always Encrypted používá algoritmus AEAD_AES_256_CBC_HMAC_SHA_256 k šifrování dat v databázi.

AEAD_AES_256_CBC_HMAC_SHA_256 se odvozuje od návrhu specifikace na https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05adrese . Používá schéma ověřeného šifrování s přidruženými daty podle přístupu Encrypt-then-MAC. To znamená, že prostý text je nejprve zašifrován a mac je vytvořen na základě výsledné šifry.

Aby bylo možné skrývat vzory, AEAD_AES_256_CBC_HMAC_SHA_256 používá režim operace CBC (Cipher Block Chaining), kde počáteční hodnota je předána do systému s názvem inicializační vektor (IV). Úplný popis režimu CBC najdete na adrese https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.

AEAD_AES_256_CBC_HMAC_SHA_256 vypočítá hodnotu šifrového textu pro danou hodnotu prostého textu pomocí následujícího postupu.

Krok 1: Generování inicializačního vektoru (IV)

Funkce Always Encrypted podporuje dvě varianty AEAD_AES_256_CBC_HMAC_SHA_256:

  • Randomizováno

  • Deterministický

U randomizovaného šifrování se iv náhodně generuje. V důsledku toho se při každém zašifrování stejného prostého textu vygeneruje jiný šifrovaný text, který brání zpřístupnění informací.

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

Pokud je použito deterministické šifrování, inicializační vektor není generován náhodně, ale místo toho je odvozen z hodnoty prostého textu pomocí následujícího algoritmu:

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

Kde je iv_key odvozena z CEK následujícím způsobem:

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

Zkrácení hodnoty HMAC se provádí tak, aby odpovídala jednomu bloku dat, jak je potřeba pro inicializační vektor (IV). V důsledku toho deterministické šifrování vždy vytváří stejný šifrový text pro danou hodnotu prostého textu, což umožňuje odvodit, zda jsou dvě hodnoty prostého textu stejné porovnáním odpovídajících hodnot šifrového textu. Toto omezené zpřístupnění informací umožňuje databázovému systému podporovat porovnání rovnosti u šifrovaných hodnot sloupců.

Deterministické šifrování je efektivnější v maskování vzorů v porovnání s alternativami, jako je použití předdefinované hodnoty IV.

Krok 2: Computing AES_256_CBC Ciphertext

Po výpočtu IV se vygeneruje AES_256_CBC šifrový text:

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

Šifrovací klíč (enc_key) je odvozen z klíče CEK následujícím způsobem.

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

Krok 3: Výpočty MAC

Následně se mac vypočítá pomocí následujícího algoritmu:

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)  

Krok 4: Zřetězení

Nakonec se šifrovaná hodnota vytvoří zřetězením bajtu verze algoritmu, MAC, IV a AES_256_CBC šifrovaného textu.

aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext  

Délka šifrového textu

Délky (v bajtech) konkrétních součástí AEAD_AES_256_CBC_HMAC_SHA_256 šifry jsou:

  • versionbyte: 1

  • MAC: 32

  • IV: 16

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

    • block_size je 16 bajtů

    • cell_data je hodnota prostého textu.

    Proto je minimální velikost aes_256_cbc_ciphertext 1 blok, což je 16 bajtů.

Délka šifrovaného textu, která je výsledkem šifrování zadaných hodnot prostého textu (cell_data), lze tedy vypočítat pomocí následujícího vzorce:

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

Například:

  • Hodnota 4 bajtu dlouhého int prostého textu se po šifrování změní na binární hodnotu s délkou 65 bajtů.

  • 2 000 bajtů nchar(1000) dlouhých hodnot prostého textu se po šifrování stane 2 065 dlouhou bajtovou binární hodnotou.

Následující tabulka obsahuje úplný seznam datových typů a délku šiferového textu pro každý typ.

Datový typ Délka šifrového textu [bajty]
bigint 65
binary Liší se. Použijte výše uvedený vzorec.
bit 65
znak Liší se. Použijte výše uvedený vzorec.
date 65
datetime 65
datetime2 65
datetimeoffset 65
decimal 81
float 65
geography Není k dispozici (nepodporuje se)
geometry Není k dispozici (nepodporuje se)
hierarchyid Není k dispozici (nepodporuje se)
image Není k dispozici (nepodporuje se)
int 65
peníze 65
nchar Liší se. Použijte výše uvedený vzorec.
ntext Není k dispozici (nepodporuje se)
číselný 81
nvarchar Liší se. Použijte výše uvedený vzorec.
skutečné 65
smalldatetime 65
smallint 65
málo peněz 65
sql_variant Není k dispozici (nepodporuje se)
sysname Není k dispozici (nepodporuje se)
text Není k dispozici (nepodporuje se)
time 65
časová značka

(rowversion)
Není k dispozici (nepodporuje se)
tinyint 65
uniqueidentifier 81
varbinary Liší se. Použijte výše uvedený vzorec.
varchar Liší se. Použijte výše uvedený vzorec.
xml Není k dispozici (nepodporuje se)

Referenční informace k .NET

Podrobnosti o algoritmech popsaných v tomto dokumentu najdete v souborech SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs a SqlColumnEncryptionCertificateStoreProvider.cs v .NET Reference.

Viz také