Aracılığıyla paylaş


Always Encrypted veri şifreleme özelliği

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Bu belgede, SQL Server ve Azure SQL Veritabanı'ndaki Always Encrypted özelliğinde kullanılan şifreleme malzemesini türetmeye yönelik şifreleme algoritmaları ve mekanizmaları açıklanmaktadır.

Anahtarlar, anahtar depoları ve anahtar şifreleme algoritmaları

Always Encrypted iki tür anahtar kullanır: Sütun ana anahtarları ve sütun şifreleme anahtarları.

Sütun ana anahtarı (CMK), her zaman istemcinin denetiminde olan ve bir dış anahtar deposunda depolanan bir anahtar şifreleme anahtarıdır (örneğin, diğer anahtarları şifrelemek için kullanılan bir anahtar). Always Encrypted özellikli istemci sürücüsü, sürücü kitaplığının (Microsoft/sistem sağlayıcısı) veya istemci uygulamasının (özel bir sağlayıcı) parçası olabilecek bir CMK deposu sağlayıcısı aracılığıyla anahtar deposuyla etkileşim kurar. İstemci sürücü kitaplıkları şu anda Windows Sertifika Deposu ve donanım güvenlik modülleri (HSM) için Microsoft anahtar deposu sağlayıcıları içerir. Geçerli sağlayıcı listesi için bkz. CREATE COLUMN MASTER KEY (Transact-SQL). Uygulama geliştiricisi rastgele bir depo için özel sağlayıcı sağlayabilir.

Sütun şifreleme anahtarı (CEK), CMK tarafından korunan bir içerik şifreleme anahtarıdır (örneğin, verileri korumak için kullanılan bir anahtar).

Tüm Microsoft CMK depolama sağlayıcıları, Optimum Asimetrik Şifreleme Doldurma (RSA-OAEP) ile RSA kullanarak CEK'leri şifreler. Microsoft Şifreleme API'sini destekleyen anahtar deposu sağlayıcısı: .NET Framework'te (SqlColumnEncryptionCngProvider Sınıfı) Yeni Nesil (CNG), RFC 8017 tarafından Bölüm A.2.1'de belirtilen varsayılan parametreleri kullanır. Bu varsayılan parametreler SHA-1 karma işlevini ve SHA-1 ile MGF1'in maske oluşturma işlevini kullanır. Diğer tüm anahtar deposu sağlayıcıları SHA-256 kullanır.

Always Encrypted dahili olarak FIPS 140-2 doğrulanmış şifreleme modüllerini kullanır.

Veri Şifreleme Algoritması

Always Encrypted, veritabanındaki verileri şifrelemek için AEAD_AES_256_CBC_HMAC_SHA_256 algoritmasını kullanır.

AEAD_AES_256_CBC_HMAC_SHA_256 , konumundaki https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05belirtim taslağından türetilir. İlişkili Verilerle Kimliği Doğrulanmış Şifreleme şeması kullanılarak, Encrypt-then-MAC yaklaşımını izler. Yani, düz metin önce şifrelenir ve MAC sonuçta elde edilen şifreleme metnine göre oluşturulur.

AEAD_AES_256_CBC_HMAC_SHA_256, desenleri gizlemek için, başlatma vektör (IV) adlı sisteme bir ilk değerin beslendiği Şifreleme Blok Zinciri (CBC) işlem modunu kullanır. CBC modunun tam açıklamasını adresinde https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdfbulabilirsiniz.

AEAD_AES_256_CBC_HMAC_SHA_256 aşağıdaki adımları kullanarak belirli bir düz metin değeri için bir şifreleme metni değeri hesaplar.

1. Adım: Başlatma vektörlerini oluşturma (IV)

Always Encrypted, iki varyasyon halinde AEAD_AES_256_CBC_HMAC_SHA_256'yı destekler:

  • Rastgeleleştirilmiş

  • Deterministik

Rastgele şifreleme için IV rastgele oluşturulur. Sonuç olarak, aynı düz metin her şifrelendiğinde, bilgilerin açığa çıkmasını önleyen farklı bir şifreleme metni oluşturulur.

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

Belirleyici şifreleme varsa IV rastgele oluşturulmaz, ancak bunun yerine aşağıdaki algoritma kullanılarak düz metin değerinden türetilir:

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

burada iv_key aşağıdaki şekilde CEK'den türetilir:

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

HMAC değerinin kesilmesi, IV için gereken bir veri bloğuna sığacak şekilde gerçekleştirilir. Sonuç olarak, belirleyici şifreleme her zaman belirli bir düz metin değeri için aynı şifreleme metnini üretir ve bu da karşılık gelen şifreleme metni değerlerini karşılaştırarak iki düz metin değerinin eşit olup olmadığının çıkarılmalarına olanak tanır. Bu sınırlı bilgilerin açığa çıkması, veritabanı sisteminin şifrelenmiş sütun değerlerinde eşitlik karşılaştırmasını desteklemesini sağlar.

Deterministik şifreleme, önceden tanımlanmış IV değeri kullanma gibi alternatiflere kıyasla desenleri gizlemede daha etkilidir.

2. Adım: AES_256_CBC Şifreli Metin Hesaplama

IV hesapladıktan sonra AES_256_CBC şifreleme metni oluşturulur:

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

Burada şifreleme anahtarı (enc_key) CEK'den aşağıdaki gibi türetilir.

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

3. Adım: MAC Hesaplaması

Daha sonra, MAC aşağıdaki algoritma kullanılarak hesaplanır:

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. Adım: Birleştirme

Son olarak, şifrelenmiş değer algoritma sürümü bayt, MAC, IV ve AES_256_CBC şifre metni birleştirilerek oluşturulur:

aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext  

Şifreleme Metni Uzunluğu

AEAD_AES_256_CBC_HMAC_SHA_256 şifreleme metninin belirli bileşenlerinin uzunlukları (bayt cinsinden):

  • versionbyte: 1

  • MAC: 32

  • IV: 16

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

    • block_size 16 bayttır

    • cell_data düz metin değeridir

    Bu nedenle, en düşük aes_256_cbc_ciphertext boyutu 1 blok ve 16 bayttır.

Bu nedenle, belirli bir düz metin değerinin (cell_data) şifrelenmesinden kaynaklanan şifreleme metninin uzunluğu aşağıdaki formül kullanılarak hesaplanabilir:

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

Örneğin:

  • 4 baytlık uzun int düz metin değeri, şifrelemeden sonra 65 baytlık uzun ikili değere dönüşür.

  • 2.000 bayt uzunluğunda nchar(1000) düz metin değerleri, şifrelemeden sonra 2.065 baytlık uzun ikili değere dönüşür.

Aşağıdaki tabloda veri türlerinin tam listesi ve her tür için şifreleme metninin uzunluğu yer alır.

Veri Türü Şifreleme Metni Uzunluğu [bayt]
bigint 65
binary Değişir. Yukarıdaki formülü kullanın.
bit 65
char Değişir. Yukarıdaki formülü kullanın.
date 65
datetime 65
datetime2 65
datetimeoffset 65
decimal 81
float 65
geography Yok (desteklenmez)
geometry Yok (desteklenmez)
hierarchyid Yok (desteklenmez)
image Yok (desteklenmez)
int 65
para 65
nchar Değişir. Yukarıdaki formülü kullanın.
ntext Yok (desteklenmez)
Sayısal 81
nvarchar Değişir. Yukarıdaki formülü kullanın.
Gerçek 65
smalldatetime 65
smallint 65
küçük para 65
sql_variant Yok (desteklenmez)
sysname Yok (desteklenmez)
text Yok (desteklenmez)
time 65
zaman etiketi

(rowversion)
Yok (desteklenmez)
tinyint 65
uniqueidentifier 81
varbinary Değişir. Yukarıdaki formülü kullanın.
varchar Değişir. Yukarıdaki formülü kullanın.
xml Yok (desteklenmez)

.NET Referansı

Bu belgede açıklanan algoritmalarla ilgili ayrıntılar için .NET Başvurusu'ndakiSqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs ve SqlColumnEncryptionCertificateStoreProvider.cs dosyalarına bakın.

Ayrıca bakınız