Always Encrypted veri şifreleme özelliği

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

Bu makalede, SQL Server ve Azure SQL Veritabanı Always Encrypted özelliğinde kullanılan şifreleme malzemelerini türetmeye yönelik şifreleme algoritmaları ve mekanizmaları açıklanmaktadır. Bu algoritmalar Always Encrypted'ın tüm sürümleri ve sürümleri için geçerlidir; hem güvenli kuşatmalarla hem de koruma olmadan Always Encrypted aynı şifreleme algoritmasını kullanı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 , İlişkili Verilerle Kimliği Doğrulanmış Şifreleme anlamına gelir; HMAC , karma tabanlı ileti kimlik doğrulama kodu anlamına gelir; MAC , ileti kimlik doğrulama kodunun kısaltmasıdır.

AEAD_AES_256_CBC_HMAC_SHA_256, IETF belirtimi 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ı ABD Ulusal Standartlar ve Teknoloji Enstitüsü'nde (NIST) bulunabilir.

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 için 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 metninin hesaplanması

Always Encrypted'ın AEAD_AES_256_CBC_HMAC_SHA_256 algoritması için 1. Adımda IV hesaplandı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) sütun şifreleme anahtarından (CEK) 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ı

Always Encrypted'ın AEAD_AES_256_CBC_HMAC_SHA_256 algoritması için MAC (ileti kimlik doğrulama kodu), sütun şifreleme anahtarından (CEK) türetilen bir mac_key kullanılarak sürüm baytından, IV'den (1. Adım'dan) ve AES_256_CBC şifreleme metninden (2. Adım) 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

Always Encrypted'ın AEAD_AES_256_CBC_HMAC_SHA_256 algoritması için, son şifrelenmiş değer algoritma sürüm baytını, MAC'i (3. Adım'dan), IV'yi (1. Adım'dan) ve AES_256_CBC şifreleme metnini birleştirerek oluşturulur (2. Adımdan):

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):

Bileşen Boyut (bayt)
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 ve cell_data düz metin değeridir. En küçük boyutu aes_256_cbc_ciphertext bir blok (16 bayt) olur.

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ğeri, şifrelemeden sonra 2.065 baytlık uzun ikili değere dönüşür.

Şifreleme metni uzunluğu kaynak veri türüne bağlıdır. Sabit uzunluklu türler için sonuç bir sabittir; değişken uzunluklu türler için (char, nchar, varchar, nvarchar, binary, varbinary), yukarıdaki formülü kullanın. Yok olarak işaretlenen türler Always Encrypted ile şifrelenemez. 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 başvurusu

Bu makalede ele alınan algoritmalarla ilgili ayrıntılar için .NET Başvurusu'ndakiSqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs ve SqlColumnEncryptionCngProvider.cs dosyalarına bakın.