Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Azure 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.