Always Encrypted funkció titkosítás

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Ez a cikk az SQL Server és az Azure SQL Database Always Encrypted funkciójában használt kriptográfiai anyag származtatására szolgáló titkosítási algoritmusokat és mechanizmusokat ismerteti. Ezek az algoritmusok az Always Encrypted összes kiadására és verziójára érvényesek; Az Always Encrypted biztonságos enklávékkal és anélkül is ugyanazt a titkosítási algoritmust használja.

Kulcsok, kulcstárolók és kulcstitkosítási algoritmusok

Az Always Encrypted két kulcstípust használ: az oszlop főkulcsait és az oszloptitkosítási kulcsokat.

Az oszlop főkulcsa (CMK) egy kulcstitkosítási kulcs (például más kulcsok titkosítására használt kulcs), amely mindig az ügyfél vezérlőjében van, és egy külső kulcstárolóban van tárolva. Az Always Encrypted-kompatibilis ügyfélillesztők egy CMK-tárolószolgáltatón keresztül kommunikálnak a kulcstárolóval, amely lehet az illesztőprogram-kódtár (a Microsoft/rendszerszolgáltató) vagy az ügyfélalkalmazás (egyéni szolgáltató) része. Az ügyfélillesztő-kódtárak jelenleg a Windows Tanúsítványtárolóhoz és a hardveres biztonsági modulokhoz (HSM-ekhez) tartozó Microsoft-kulcstároló-szolgáltatókat tartalmazzák. A szolgáltatók aktuális listáját lásd CREATE COLUMN MASTER KEY : (Transact-SQL). Az alkalmazásfejlesztők megadhatnak egy egyéni szolgáltatót egy tetszőleges tárolóhoz.

Az oszloptitkosítási kulcs (CEK) egy tartalomtitkosítási kulcs (például az adatok védelmére használt kulcs), amelyet CMK véd.

Minden Microsoft CMK-tároló szolgáltató az RSA-t Optimális aszimmetrikus titkosítási paddinggel (RSA-OAEP) használva titkosítja a CEK-eket. A Microsoft Cryptography API: Next Generation (CNG) a .NET-keretrendszerben (SqlColumnEncryptionCngProvider osztály) támogató kulcstár-szolgáltató az RFC 8017 által az A.2.1 szakaszban megadott alapértelmezett paramétereket használja. Ezek az alapértelmezett paraméterek az SHA-1 kivonatfüggvényét és az MGF1 és az SHA-1 maszkgenerálási függvényét használják. Minden más kulcstároló-szolgáltató az SHA-256-ot használja.

Az Always Encrypted belsőleg FIPS 140-2 hitelesített titkosítási modulokat használ.

Adattitkosítási algoritmus

Az Always Encrypted a AEAD_AES_256_CBC_HMAC_SHA_256 algoritmussal titkosítja az adatbázisban lévő adatokat. Az AEAD a társított adatokkal rendelkező hitelesített titkosítást jelenti; A HMAC a kivonatalapú üzenethitelesítési kód; A MAC az üzenethitelesítési kód.

AEAD_AES_256_CBC_HMAC_SHA_256 az IETF specifikációs tervezetéből származik. Hitelesített titkosítási sémát használ társított adatokkal, előbb titkosít, majd MAC megközelítést követve. Ez azt jelenti, hogy a egyszerű szöveg először titkosítva van, a MAC pedig az eredményként kapott rejtjelszöveg alapján jön létre.

A minták elrejtéséhez AEAD_AES_256_CBC_HMAC_SHA_256 a Titkosítási blokklánc (CBC) üzemmódot használja, ahol a rendszer egy kezdeti értéket ad az inicializálási vektor (IV) nevű rendszerbe. A CBC mód teljes leírása az USA Nemzeti Szabványügyi és Technológiai Intézetében (NIST) található.

AEAD_AES_256_CBC_HMAC_SHA_256 az alábbi lépések végrehajtásával kiszámítja egy adott egyszerű szöveges érték titkosítási értékét.

1. lépés: Az inicializálási vektor (IV) létrehozása

Az Always Encrypted a AEAD_AES_256_CBC_HMAC_SHA_256 két változatát támogatja:

  • Randomizált

  • Determinisztikus

Véletlenszerű titkosítás esetén a IV véletlenszerűen jön létre. Ennek eredményeképpen minden alkalommal, amikor ugyanazt az egyszerű szöveget titkosítják, egy másik titkosítószöveg jön létre, amely megakadályozza az információk felfedését.

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

A determinisztikus titkosításhoz a IV nem véletlenszerűen jön létre, hanem a egyszerű szöveges értékből származik a következő algoritmus használatával:

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

Ahol a iv_key a CEK-ből származtatják a következő módon:

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

A HMAC érték csonkolását úgy végzik el, hogy illeszkedjen egy adatblokkba, ami szükséges az IV-hez. Ennek eredményeképpen a determinisztikus titkosítás mindig ugyanazt a rejtjelszöveget állítja elő egy adott egyszerű szöveges értékhez, amely lehetővé teszi annak megállapítását, hogy két egyszerű szöveges érték egyenlő-e a megfelelő rejtjelszöveg-értékek összehasonlításával. Ez a korlátozott információfelfedés lehetővé teszi, hogy az adatbázisrendszer támogassa a titkosított oszlopértékek egyenlőségi összehasonlítását.

A determinisztikus titkosítás hatékonyabb a minták elrejtésében, mint az alternatívák, például egy előre definiált IV-érték használata.

2. lépés: AES_256_CBC titkosítási szöveg kiszámítása

Az Always Encrypted AEAD_AES_256_CBC_HMAC_SHA_256 algoritmusa esetén az 1. lépésben szereplő IV kiszámítása után a AES_256_CBC titkosítási szöveg jön létre:

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

Ahol a titkosítási kulcs (enc_key) az oszloptitkosítási kulcsból (CEK) származik az alábbiak szerint:

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

3. lépés: A MAC számítása

Az Always Encrypted AEAD_AES_256_CBC_HMAC_SHA_256 algoritmusa esetében a MAC (üzenethitelesítési kód) a verzió bájtjából, a IV-ből (az 1. lépésből) és a AES_256_CBC rejtjelszövegből (a 2. lépésből) számítódik ki az oszloptitkosítási kulcs (CEK) alapján mac_key :

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)  

4. lépés: Összefűzés

Az Always Encrypted AEAD_AES_256_CBC_HMAC_SHA_256 algoritmusa esetében a végső titkosított érték az algoritmus verzió bájtjának, a MAC -nek (a 3. lépésből), a IV-nek (az 1. lépésből) és a AES_256_CBC rejtjelszövegnek (a 2. lépésből) összefűzésével jön létre:

aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext  

Rejtjelszöveg hossza

A AEAD_AES_256_CBC_HMAC_SHA_256 titkosítási szöveg egyes összetevőinek hossza (bájtban):

Komponens Méret (bájt)
versionbyte 1
MAC 32
IV 16
aes_256_cbc_ciphertext (FLOOR(DATALENGTH(cell_data) / block_size) + 1) * block_size, ahol block_size 16 bájt, és cell_data az egyszerű szöveges érték. A minimális méret aes_256_cbc_ciphertext egy blokk (16 bájt).

Így egy adott egyszerű szöveges érték (cell_data) titkosításából eredő rejtjelszöveg hossza a következő képlettel számítható ki:

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

Például:

  • A 4 bájt hosszú egyszerű szöveges érték 65 bájt hosszú bináris érték lesz a titkosítás után.

  • A 2000 bájt hosszú nchar(1000) egyszerű szöveges érték 2065 bájt hosszú bináris érték lesz a titkosítás után.

A rejtjelszöveg hossza a forrás adattípusától függ. Rögzített hosszúságú típusok esetén az eredmény állandó; változó hosszúságú típusok (char, , nchar, varcharnvarchar, , binary), varbinaryhasználja a fenti képletet. Az N/A jelölésű típusok nem titkosíthatók az Always Encrypted használatával. Az alábbi táblázat az adattípusok teljes listáját és az egyes típusokhoz tartozó rejtjelek hosszát tartalmazza.

Adattípus Rejtjelszöveg hossza [bájt]
bigint 65
binary Változik. Használja a fenti képletet.
bit 65
karakteres Változik. Használja a fenti képletet.
date 65
datetime 65
datetime2 65
datetimeoffset 65
decimal 81
float 65
geography N/A (nem támogatott)
geometry N/A (nem támogatott)
hierarchyid N/A (nem támogatott)
image N/A (nem támogatott)
int 65
pénz 65
nchar Változik. Használja a fenti képletet.
kontextus N/A (nem támogatott)
Numerikus 81
nvarchar Változik. Használja a fenti képletet.
valódi 65
smalldatetime 65
smallint 65
smallmoney 65
sql_variant N/A (nem támogatott)
sysname N/A (nem támogatott)
text N/A (nem támogatott)
time 65
időbélyeg

(rowversion)
N/A (nem támogatott)
tinyint 65
uniqueidentifier 81
varbinary Változik. Használja a fenti képletet.
varchar Változik. Használja a fenti képletet.
xml N/A (nem támogatott)

.NET-referencia

Az ebben a cikkben tárgyalt algoritmusokról a .NET-referenciaSqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs és SqlColumnEncryptionCngProvider.cs fájljaiban talál további információt.