Bagikan melalui


Kriptografi Always Encrypted

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure 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)  

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

Baca juga