Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Artikel ini menjelaskan algoritma dan mekanisme enkripsi untuk mendapatkan materi kriptografi yang digunakan dalam fitur Always Encrypted di SQL Server dan Azure SQL Database. Algoritma ini berlaku untuk semua edisi dan versi Always Encrypted; Always Encrypted dengan dan tanpa enklave aman menggunakan algoritma enkripsi yang sama.
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 CREATE COLUMN MASTER KEY (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 CMK Microsoft mengenkripsi CEK 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 adalah singkatan dari Authenticated Encryption dengan Associated Data; HMAC adalah singkatan dari kode autentikasi pesan berbasis hash; MAC adalah singkatan dari kode autentikasi pesan.
AEAD_AES_256_CBC_HMAC_SHA_256 berasal dari draf spesifikasi IETF. 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 tentang mode CBC dapat ditemukan di Institut Standar dan Teknologi Nasional AS (NIST).
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:
Diacak
Deterministik
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 cryptographically random 128bits
Untuk enkripsi deterministik, IV tidak dihasilkan secara acak, tetapi sebaliknya 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 muat dalam satu blok data sebagaimana diperlukan 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: Menghitung ciphertext AES_256_CBC
Untuk algoritma AEAD_AES_256_CBC_HMAC_SHA_256 Always Encrypted, setelah menghitung IV di Langkah 1, 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 kunci enkripsi kolom (CEK) sebagai berikut:
enc_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell encryption key" + algorithm + CEK_length )
Langkah 3: Menghitung MAC
Untuk algoritma AEAD_AES_256_CBC_HMAC_SHA_256 milik Always Encrypted, MAC (kode autentikasi pesan) dihitung berdasarkan byte versi, IV (dari Langkah 1), dan ciphertext AES_256_CBC (dari Langkah 2), menggunakan mac_key yang diturunkan dari kunci enkripsi kolom (CEK):
MAC = HMAC-SHA-256(mac_key, versionbyte + IV + Ciphertext + versionbyte_length)
Di mana:
versionbyte = 0x01 and versionbyte_length = 1
mac_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell MAC key" + algorithm + CEK_length)
Langkah 4: Penggabungan
Untuk algoritma AEAD_AES_256_CBC_HMAC_SHA_256 Always Encrypted, nilai terenkripsi akhir dihasilkan dengan menggabungkan byte versi algoritma, MAC (dari Langkah 3), IV (dari Langkah 1), dan ciphertext AES_256_CBC (dari Langkah 2):
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:
| Component | Ukuran (byte) |
|---|---|
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 dan cell_data merupakan nilai teks biasa. Ukuran aes_256_cbc_ciphertext minimum adalah satu blok (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.
Panjang ciphertext tergantung pada jenis data sumber. Untuk jenis panjang tetap, hasilnya adalah konstanta; untuk jenis panjang variabel (char, , nchar, varchar, nvarcharbinary, ), varbinarygunakan rumus di atas. Jenis bertanda N/A tidak dapat dienkripsi dengan Always Encrypted. 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. |
| tanggal | 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 |
| sql_variant | N/A (tidak didukung) |
| sysname | N/A (tidak didukung) |
| text | N/A (tidak didukung) |
| time | 65 |
|
timestamp (rowversion) |
N/A (tidak didukung) |
| tinyint | 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 artikel ini, lihat file SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs, dan SqlColumnEncryptionCngProvider.cs di Referensi .NET.