Enkripsi kolom memungkinkan Anda menyimpan kolom tertentu dalam bentuk terenkripsi dan mengambil data aslinya menggunakan fungsi dekripsi bawaan. Berbeda dengan enkripsi tingkat field menggunakan aes_encrypt, enkripsi kolom mengelola kunci di server database—sehingga bahkan pengguna yang memiliki akses langsung ke database tidak dapat membaca nilai terenkripsi tanpa secara eksplisit memanggil fungsi dekripsi. Pendekatan ini memberikan pemisahan yang jelas antara pihak yang memiliki data dan pihak yang mengoperasikan database.
Enkripsi kolom sedang dalam rilis bertahap. Parameter terkait belum tersedia di Konsol. Untuk menggunakan fitur ini, buka Quota Center. Temukan kuota dengan Quota ID polardb_mysql_column_encryption, lalu klik Apply pada kolom Actions.Persyaratan versi
Didukung pada kluster PolarDB for MySQL 8.0.2 yang menjalankan versi minor 8.0.2.2.30 atau lebih baru.
Batasan
Tinjau batasan berikut sebelum mengaktifkan enkripsi kolom untuk memastikan fitur ini sesuai dengan kasus penggunaan Anda.
Overhead performa
| Operasi | Overhead | Kondisi |
|---|---|---|
| Penyisipan single-threaded (tulis) | ~3% | Binary logging dinonaktifkan |
| Penyisipan single-threaded (tulis) | Kurang dari 3% | Binary logging diaktifkan, atau tabel memiliki lebar baris besar |
| Dekripsi per Pernyataan SQL (baca) | ~6% | Satu panggilan enhanced_aes_decrypt per pernyataan |
Penggunaan Indeks
Indeks pada kolom terenkripsi diurutkan berdasarkan ciphertext, bukan teks biasa. Karena perbandingan dalam ruang nilai terenkripsi tidak bermakna untuk rentang, hanya kueri titik (perbandingan kesamaan) yang dapat menggunakan indeks. Kueri rentang seperti WHERE age > 20 dan pencocokan pola seperti LIKE '%key%' tidak dapat menggunakan indeks dan akan menghasilkan pemindaian tabel penuh.
Jika kueri Anda memerlukan perbandingan rentang pada kolom sensitif, pertimbangkan untuk menerapkan enkripsi di lapisan aplikasi, tempat Anda memiliki kendali lebih besar atas logika kueri.
Batasan properti tabel
Tabel dengan kolom virtual tidak didukung.
Hanya mesin penyimpanan InnoDB yang didukung.
Tabel terpartisi tidak didukung.
Kolom terenkripsi harus menggunakan tipe
VARBINARY.Panjang field harus minimal 44 byte.
Anda tidak dapat menambahkan kolom terenkripsi secara langsung dengan
ADD COLUMN. GunakanMODIFYuntuk mengonversi kolom standar yang sudah ada menjadi kolom terenkripsi.
Menyiapkan enkripsi kolom
Menyiapkan enkripsi kolom melibatkan empat langkah:
Otorisasi PolarDB untuk mengakses KMS — memberikan izin kepada server database untuk menggunakan Key Management Service (KMS) dalam operasi kunci.
Enable Transparent Data Encryption (TDE) — enkripsi kolom berbagi integrasi KMS dengan TDE.
Aktifkan parameter enkripsi kolom — mengaktifkan fitur ini di tingkat kluster.
Berikan hak istimewa yang diperlukan — akun database Anda harus memiliki hak istimewa
ENCRYPTION_FUN_ADMIN.
Langkah 1: Otorisasi PolarDB untuk mengakses KMS
Otorisasi PolarDB untuk mengakses KMS sebelum melanjutkan.
Langkah 2: Aktifkan TDE
Enkripsi kolom menggunakan TDE untuk manajemen kunci. Aktifkan TDE di Konsol PolarDB.
Mengaktifkan TDE akan melakukan restart kluster PolarDB. Rencanakan downtime sebelum melanjutkan.
TDE tidak dapat dinonaktifkan setelah diaktifkan.
Mengaktifkan TDE itu sendiri tidak menimbulkan overhead performa tambahan untuk tabel non-TDE atau tabel yang tidak menggunakan enkripsi kolom.
Masuk ke Konsol PolarDB. Di panel navigasi kiri, klik Clusters, pilih wilayah kluster, lalu klik ID kluster.
Di panel navigasi kiri, klik Settings and Management > Security.
Pada tab TDE Settings, aktifkan TDE Status dan tentukan kunci kustom.

Pilih kunci. Pilih Use an existing custom key atau Select a key in the pop-up window. Kunci dapat dihasilkan oleh KMS.

Sebelum menghapus kunci di KMS, pastikan kunci tersebut telah diputuskan asosiasinya dari semua tabel terenkripsi, termasuk versi historisnya. Jika tidak, kluster PolarDB mungkin menjadi tidak tersedia setelah restart.
Langkah 3: Aktifkan parameter enkripsi kolom
Atur parameter loose_polar_enable_column_encryption ke ON. Untuk petunjuknya, lihat Set cluster and node parameters.
| Parameter | Default | Deskripsi |
|---|---|---|
loose_polar_enable_column_encryption | OFF | Mengaktifkan atau menonaktifkan enkripsi kolom. Atur ke ON untuk mengaktifkan. |
Langkah 4: Berikan hak istimewa yang diperlukan
Akun database Anda harus memiliki hak istimewa ENCRYPTION_FUN_ADMIN untuk menggunakan fungsi enkripsi kolom. Akun istimewa dapat memberikan hak istimewa ini.
-- Berikan hak istimewa
GRANT ENCRYPTION_FUN_ADMIN ON *.* TO 'testman'@'%';
-- Verifikasi hak istimewa
SHOW GRANTS;Definisikan dan gunakan kolom terenkripsi
Buat tabel dengan kolom terenkripsi
Gunakan kata kunci ENCRYPTION untuk menandai kolom sebagai terenkripsi.
USE mydatabase;
CREATE TABLE IF NOT EXISTS `my_pan` (
`id` INT NOT NULL AUTO_INCREMENT,
`pan` VARBINARY(128) NOT NULL ENCRYPTION,
`desc` blob Default NULL,
KEY `idx_pan` (`pan`),
PRIMARY KEY (`id`)
);Kolom dengan nilai defaultNULLdapat dienkripsi, tetapi nilaiNULLtidak dienkripsi.
Konversi kolom yang sudah ada
Gunakan MODIFY untuk mengonversi kolom standar menjadi kolom terenkripsi, atau untuk menghapus enkripsi:
-- Konversi ke terenkripsi
ALTER TABLE my_pan MODIFY `pan` VARBINARY(128) ENCRYPTION;
-- Hapus enkripsi
ALTER TABLE my_pan MODIFY `pan` VARBINARY(128) NOT ENCRYPTION;Buat indeks pada kolom terenkripsi
Sintaksnya sama seperti kolom standar. Data indeks disimpan sebagai ciphertext dan diurutkan berdasarkan nilai terenkripsi.
CREATE INDEX idx_pan ON my_pan(pan);Sisipkan data
Data yang dimasukkan ke kolom terenkripsi akan dienkripsi secara otomatis. Memanggil enhanced_aes_encrypt saat penyisipan tidak diperlukan.
INSERT INTO `my_pan` VALUES(1, "my_passwd", "aaa");Kueri data
Dua fungsi untuk enkripsi dan dekripsi adalah:
-- Enkripsi nilai (untuk digunakan dalam klausa WHERE)
enhanced_aes_encrypt(data, db_name, table_name)
-- Dekripsi nilai (untuk digunakan dalam klausa SELECT atau WHERE)
enhanced_aes_decrypt(data)Tiga pola kueri umum:
-- 1. Kueri titik tanpa indeks (gaya kueri rentang): mendekripsi setiap baris, pemindaian tabel penuh
SELECT id, enhanced_aes_decrypt(pan) FROM `my_pan`
WHERE enhanced_aes_decrypt(pan) = 'my_password_10';
-- 2. Kueri titik menggunakan indeks, mengembalikan teks biasa
SELECT id, enhanced_aes_decrypt(pan) FROM `my_pan`
WHERE pan = enhanced_aes_encrypt('my_password_10', "mydatabase", "my_pan");
-- 3. Kueri titik menggunakan indeks, mengembalikan ciphertext
SELECT id, pan FROM `my_pan`
WHERE pan = enhanced_aes_encrypt('my_password_10', "mydatabase", "my_pan");Perbarui dan hapus data
-- Perbarui menggunakan indeks kunci primer
UPDATE `my_pan` SET pan = 'new6-password', DESC = 'Senior6' WHERE id = 1;
-- Perbarui menggunakan indeks kolom terenkripsi
UPDATE `my_pan` SET pan = 'new6-password', DESC = 'Senior6'
WHERE pan = enhanced_aes_encrypt('my_password_6', "mydatabase", "my_pan");
-- Hapus menggunakan indeks kunci primer
DELETE FROM `my_pan` WHERE id = 1;
-- Hapus menggunakan indeks kolom terenkripsi
DELETE FROM `my_pan`
WHERE pan = enhanced_aes_encrypt('my_password_2', "mydatabase", "my_pan");Manage keys
Lihat penggunaan kunci
Jalankan pernyataan berikut untuk melihat kunci yang sedang digunakan untuk semua tabel terenkripsi:
SELECT * FROM information_schema.INNODB_COLUMN_ENCRYPTED_TABLE;Rotasi kunci
PolarDB tidak secara otomatis memperbarui versi kunci master untuk kunci kustom. Untuk melakukan rotasi kunci secara manual, lihat Key rotation.
Setelah rotasi kunci:
Tabel terenkripsi baru menggunakan kunci baru.
Tabel terenkripsi yang sudah ada tetap dienkripsi dengan kunci asli.
Enkripsi ulang tabel yang sudah ada
Rotasi data mengenkripsi ulang seluruh data dalam tabel menggunakan versi kunci terbaru. Operasi ini mengonsumsi sumber daya CPU dan I/O dan tidak wajib—tetapi semua kunci yang digunakan oleh tabel data yang sudah ada harus tetap tersedia.
ALTER TABLE <table_name> ENGINE = innodb, ALGORITHM = COPY;Secara default, ALGORITHM = COPY mengunci tabel selama rotasi data. Untuk menghindari gangguan layanan, aktifkan fitur Online Copy (lihat Enable Online Copy).
Perilaku penguncian selama rotasi data:
| Status Online Copy DDL | Perilaku penguncian |
|---|---|
| Dinonaktifkan (default) | Tabel dikunci selama rotasi data |
| Diaktifkan | Tabel tidak dikunci; DML konkuren diizinkan, DDL konkuren tidak diizinkan |
Aktifkan Online Copy (opsional)
Saat menggunakan ALGORITHM=COPY untuk rotasi data atau perubahan skema lainnya, tabel dikunci secara default, yang dapat mengganggu layanan. Aktifkan fitur Online Copy DDL untuk melakukan operasi ini tanpa penguncian atau dengan penguncian minimal.
| Parameter | Default | Deskripsi |
|---|---|---|
loose_polar_support_online_copy_ddl_algorithm | OFF | Sakelar utama untuk Online Copy DDL. Atur ke ON untuk mengaktifkan. |
loose_polar_support_online_copy_ddl_algorithm_for_modify | OFF | Mengizinkan rotasi data menggunakan pernyataan MODIFY. Atur ke ON untuk mengaktifkan. Kedua parameter harus diatur bersamaan. |