Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server
Azure SQL Database
Azure 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.