Kriptografi Always Encrypted
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Dokumen ini menjelaskan algoritma dan mekanisme enkripsi untuk memperoleh materi kriptografi yang digunakan dalam fitur Always Encrypted di SQL Server dan Azure SQL Database.
Kunci, penyimpanan kunci, dan algoritma enkripsi kunci
Always Encrypted menggunakan dua jenis kunci: Kunci master kolom dan kunci enkripsi kolom.
Kunci master kolom (CMK) adalah kunci enkripsi kunci (misalnya, kunci yang digunakan untuk mengenkripsi kunci lain) yang selalu berada dalam kontrol klien, dan disimpan di penyimpanan kunci eksternal. Driver klien yang didukung Always Encrypted berinteraksi dengan penyimpanan kunci melalui penyedia penyimpanan CMK, yang dapat menjadi bagian dari pustaka driver (penyedia Microsoft/sistem) atau bagian dari aplikasi klien (penyedia kustom). Pustaka driver klien saat ini menyertakan penyedia penyimpanan kunci Microsoft untuk Windows Certificate Store dan modul keamanan perangkat keras (HSM). Untuk daftar penyedia saat ini, lihat MEMBUAT KUNCI MASTER KOLOM (Transact-SQL). Pengembang aplikasi dapat menyediakan penyedia kustom untuk penyimpanan arbitrer.
Kunci enkripsi kolom (CEK), adalah kunci enkripsi konten (misalnya, kunci yang digunakan untuk melindungi data) yang dilindungi oleh CMK.
Semua penyedia penyimpanan Microsoft CMK mengenkripsi CEK dengan menggunakan RSA dengan Padding Enkripsi Asimetris Optimal (RSA-OAEP). Penyedia penyimpanan kunci yang mendukung MICROSOFT Cryptography API: Next Generation (CNG) di .NET Framework (SqlColumnEncryptionCngProvider Class) menggunakan parameter default yang ditentukan oleh RFC 8017 di Bagian A.2.1. Parameter default tersebut menggunakan fungsi hash SHA-1 dan fungsi pembuatan masker MGF1 dengan SHA-1. Semua penyedia penyimpanan kunci lainnya menggunakan SHA-256.
Always Encrypted secara internal menggunakan modul kriptografi tervalidasi FIPS 140-2.
Algoritma Enkripsi Data
Always Encrypted menggunakan algoritma AEAD_AES_256_CBC_HMAC_SHA_256 untuk mengenkripsi data dalam database.
AEAD_AES_256_CBC_HMAC_SHA_256 berasal dari draf spesifikasi di https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05. Ini menggunakan skema Enkripsi Terautentikasi dengan Data Terkait, mengikuti pendekatan Encrypt-then-MAC. Artinya, teks biasa pertama kali dienkripsi, dan MAC diproduksi berdasarkan ciphertext yang dihasilkan.
Untuk menyembunyikan pola, AEAD_AES_256_CBC_HMAC_SHA_256 menggunakan mode operasi Cipher Block Chaining (CBC), di mana nilai awal dimasukkan ke dalam sistem bernama vektor inisialisasi (IV). Deskripsi lengkap mode CBC dapat ditemukan di https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.
AEAD_AES_256_CBC_HMAC_SHA_256 menghitung nilai ciphertext untuk nilai teks biasa tertentu menggunakan langkah-langkah berikut.
Langkah 1: Menghasilkan vektor inisialisasi (IV)
Always Encrypted mendukung dua variasi AEAD_AES_256_CBC_HMAC_SHA_256:
Acak
Deterministic
Untuk enkripsi acak, IV dibuat secara acak. Akibatnya, setiap kali teks biasa yang sama dienkripsi, ciphertext yang berbeda dihasilkan, yang mencegah pengungkapan informasi apa pun.
When using randomized encryption: IV = Generate cryptographicaly random 128bits
Jika ada enkripsi deterministik, IV tidak dihasilkan secara acak, tetapi berasal dari nilai teks biasa menggunakan algoritma berikut:
When using deterministic encryption: IV = HMAC-SHA-256( iv_key, cell_data ) truncated to 128 bits.
Di mana iv_key berasal dari CEK dengan cara berikut:
iv_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell IV key" + algorithm + CEK_length)
Pemotongan nilai HMAC dilakukan agar sesuai dengan satu blok data sesuai kebutuhan untuk IV. Akibatnya, enkripsi deterministik selalu menghasilkan ciphertext yang sama untuk nilai teks biasa tertentu, yang memungkinkan menyimpulkan apakah dua nilai teks biasa sama dengan membandingkan nilai ciphertext yang sesuai. Pengungkapan informasi terbatas ini memungkinkan sistem database untuk mendukung perbandingan kesetaraan pada nilai kolom terenkripsi.
Enkripsi deterministik lebih efektif dalam menyembunyikan pola, dibandingkan dengan alternatif, seperti menggunakan nilai IV yang telah ditentukan sebelumnya.
Langkah 2: Komputasi AES_256_CBC Ciphertext
Setelah menghitung IV, ciphertext AES_256_CBC dihasilkan:
aes_256_cbc_ciphertext = AES-CBC-256(enc_key, IV, cell_data) with PKCS7 padding.
Di mana kunci enkripsi (enc_key) berasal dari CEK sebagai berikut.
enc_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell encryption key" + algorithm + CEK_length )
Langkah 3: Menghitung MAC
Selanjutnya, MAC dihitung menggunakan algoritma berikut:
MAC = HMAC-SHA-256(mac_key, versionbyte + IV + Ciphertext + versionbyte_length)
Mana:
versionbyte = 0x01 and versionbyte_length = 1
mac_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell MAC key" + algorithm + CEK_length)
Langkah 4: Penggalian
Akhirnya, nilai terenkripsi diproduksi dengan menggabungkan byte versi algoritma, MAC, IV, dan ciphertext AES_256_CBC:
aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext
Panjang Ciphertext
Panjang (dalam byte) komponen tertentu dari ciphertext AEAD_AES_256_CBC_HMAC_SHA_256 adalah:
versionbyte: 1
MAC: 32
IV: 16
aes_256_cbc_ciphertext:
(FLOOR (DATALENGTH(cell_data)/ block_size) + 1)* block_size
, di mana:block_size adalah 16 byte
cell_data adalah nilai teks biasa
Oleh karena itu, ukuran minimal aes_256_cbc_ciphertext adalah 1 blok, yaitu 16 byte.
Dengan demikian, panjang ciphertext, yang dihasilkan dari mengenkripsi nilai teks biasa tertentu (cell_data), dapat dihitung menggunakan rumus berikut:
1 + 32 + 16 + (FLOOR(DATALENGTH(cell_data)/16) + 1) * 16
Contohnya:
Nilai teks biasa int panjang 4-byte menjadi nilai biner panjang 65 byte setelah enkripsi.
Nilai teks biasa 2.000 byte panjang nchar(1000) menjadi nilai biner panjang 2.065 byte setelah enkripsi.
Tabel berikut berisi daftar lengkap tipe data dan panjang ciphertext untuk setiap jenis.
Jenis Data | Panjang Ciphertext [byte] |
---|---|
bigint | 65 |
biner | Beragam. Gunakan rumus di atas. |
bit | 65 |
Char | Beragam. Gunakan rumus di atas. |
date | 65 |
datetime | 65 |
datetime2 | 65 |
datetimeoffset | 65 |
desimal | 81 |
float | 65 |
geografi | N/A (tidak didukung) |
geometri | N/A (tidak didukung) |
hierarchyid | N/A (tidak didukung) |
gambar | N/A (tidak didukung) |
int | 65 |
uang | 65 |
nchar | Beragam. Gunakan rumus di atas. |
ntext | N/A (tidak didukung) |
numerik | 81 |
nvarchar | Beragam. Gunakan rumus di atas. |
real | 65 |
smalldatetime | 65 |
smallint | 65 |
smallmoney | 65 |
aql_variant | N/A (tidak didukung) |
nama sysname | N/A (tidak didukung) |
text | N/A (tidak didukung) |
time | 65 |
timestamp (rowversion) |
N/A (tidak didukung) |
kecil | 65 |
pengidentifikasi unik | 81 |
varbinary | Beragam. Gunakan rumus di atas. |
varchar | Beragam. Gunakan rumus di atas. |
xml | N/A (tidak didukung) |
Referensi .NET
Untuk detail tentang algoritma, yang dibahas dalam dokumen ini, lihat file SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs, dan SqlColumnEncryptionCertificateStoreProvider.cs di Referensi .NET.