Megosztás a következőn keresztül:


Always Encrypted funkció titkosítás

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

Ez a dokumentum az SQL Server és az Azure SQL Database Always Encrypted funkciójában használt titkosítási algoritmusokat és mechanizmusokat ismerteti.

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 a CREATE COLUMN MASTER KEY (Transact-SQL) című témakörben találja. 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.

AEAD_AES_256_CBC_HMAC_SHA_256 a következő specifikációs vázlatból https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05szá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 a következő helyen https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdftalá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  

Determinisztikus titkosítás esetén a IV nem véletlenszerűen jön létre, hanem az 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: Az AES_256_CBC titkosított szöveg számítása

A IV szá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) a CEK-ből 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

Ezt követően a RENDSZER a következő algoritmussal számítja ki a MAC-et:

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

Végül a titkosított érték az algoritmus-verzió bájtjának, a MAC-nek, a IV-nek és a AES_256_CBC titkosítási szövegnek a ö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):

  • verzióbájt: 1

  • MAC: 32

  • IV: 16

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

    • A blokkméret 16 bájt

    • cell_data egyszerű szöveges érték

    Ezért a aes_256_cbc_ciphertext minimális mérete 1 blokk, ami 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ékek titkosítás után 2065 bájt hosszú bináris értékgé válnak.

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

A dokumentumban tárgyalt algoritmusokkal kapcsolatos részletekért tekintse meg a .NET-referenciaSqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs és SqlColumnEncryptionCertificateStoreProvider.cs fájljait.

Lásd még