All Products
Search
Document Center

Data Security Center:Integrasikan EncJDBC

Last Updated:Jun 21, 2026

Setelah mengonfigurasi enkripsi kolom untuk kolom data sensitif di tabel database RDS MySQL, RDS PostgreSQL, PolarDB MySQL, atau PolarDB PostgreSQL, gunakan driver EncJDBC untuk menghubungkan ke database jika aplikasi Java Anda perlu mengakses teks biasa dari kolom-kolom terenkripsi tersebut. Topik ini menjelaskan cara menggunakan EncJDBC untuk menghubungkan ke database dan mengakses data teks biasa dari kolom yang telah dienkripsi.

Prasyarat

  • Aktifkan enkripsi kolom untuk database target dan atur izin ciphertext untuk akun database target menjadi Ciphertext Permission (JDBC Decryption). Untuk petunjuk lengkap tentang konfigurasi enkripsi kolom database dan izin akun, lihat Konfigurasi enkripsi kolom database.

  • Dapatkan informasi koneksi database terenkripsi: endpoint, port, nama database, akun database, dan password.

Informasi latar belakang

Fitur enkripsi kolom memungkinkan Anda menerapkan perlindungan output dinamis pada kolom sensitif tertentu di database, sehingga meningkatkan keamanan data. Setelah mengaktifkan fitur ini, sistem mengontrol hasil kueri berdasarkan kebijakan akses akun database:

  • Akun dengan Plaintext Permissions dapat melihat data mentah secara langsung.

  • Akun yang dikonfigurasi dengan Ciphertext Permission (JDBC Decryption) menerima ciphertext terenkripsi tetapi dapat secara otomatis memulihkannya menjadi teks biasa menggunakan driver JDBC selalu-rahasia (EncJDBC) milik Alibaba Cloud dan menyediakan master encryption key (MEK) yang sesuai dengan kebijakan enkripsi.

  • Akun yang dikonfigurasi dengan Ciphertext Permission (No Decryption Permission) hanya dapat melihat ciphertext dan tidak dapat mendekripsinya dengan cara apa pun.

Mekanisme ini memastikan data sensitif dilindungi secara efektif pada tahap output. Bahkan jika data diekspor atau dicegat, pihak yang tidak berwenang tidak dapat membacanya.

Buat MEK

Saat Anda mengaktifkan enkripsi kolom menggunakan metode Local key untuk suatu kolom, gerbang enkripsi kolom DSC mengenkripsi bidang sensitif menggunakan kunci terkendali sebelum mengembalikan hasil kueri ke klien. Kecuali untuk akun dengan Plaintext permission, semua akun lainnya menerima ciphertext terenkripsi saat melakukan kueri pada kolom tersebut.

Untuk mengakses teks biasa nanti menggunakan akun dengan izin Ciphertext (dekripsi JDBC), sediakan dan catat MEK Anda sendiri selama pengaturan awal enkripsi kolom. Hanya MEK yang sesuai dengan kebijakan enkripsi yang memungkinkan driver EncJDBC mendekripsi bidang ciphertext dalam hasil kueri di sisi klien.

  • Rentang nilai: String heksadesimal 16 byte, tepat 32 karakter.

  • Peran MEK: MEK adalah kredensial utama yang memberi otorisasi kepada klien EncJDBC untuk mendekripsi bidang ciphertext dalam hasil kueri. MEK melindungi kunci aktual yang digunakan untuk mengenkripsi hasil kueri.

  • Tanggung jawab keamanan: Alibaba Cloud tidak menyimpan, mencadangkan, atau menghosting MEK Anda. Lindungi MEK tersebut menggunakan solusi manajemen kunci aman seperti KMS.

  • Peringatan penting: Jika Anda kehilangan MEK, semua hasil kueri historis yang dienkripsi di bawah kebijakan ini menjadi tidak dapat didekripsi secara permanen.

Berdasarkan Encryption Method yang dipilih dalam konfigurasi enkripsi kolom database Anda, peroleh KMS Key atau buat Local Key untuk digunakan sebagai MEK dalam mendekripsi database yang sesuai.

KMS key

Penting

Pastikan layanan KMS tersedia saat menggunakan KMS key. Jika tidak, driver klien selalu-rahasia EncJDBC tidak dapat berfungsi.

Peroleh endpoint instans KMS yang memiliki KMS key yang dipilih dalam konfigurasi enkripsi kolom database Anda, serta ID AccessKey dan Rahasia AccessKey dari Akun Alibaba Cloud atau Pengguna RAM (yang harus memiliki izin dekripsi KMS) untuk membaca KMS key ini dari klien. Ikuti langkah-langkah berikut:

  1. Masuk ke konsol menggunakan Akun Alibaba Cloud atau Pengguna RAM.

  2. Jika menggunakan Pengguna RAM, berikan izin dekripsi KMS kepada Pengguna RAM tersebut.

    1. Buat kebijakan kustom. Gunakan konten kebijakan berikut:

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "KMS:Decrypt",
                  "Resource": "*"
              }
          ]
      }
    2. Lampirkan kebijakan kustom yang dibuat ke Pengguna RAM yang ditentukan. Untuk detailnya, lihat Kelola izin Pengguna RAM.

  3. Peroleh endpoint instans KMS.

    • Secara default, kunci dalam instans KMS hanya mengizinkan akses dari jaringan VPC. Di halaman manajemen instans KMS, temukan instans KMS target Anda, klik Actions, lalu Details, dan lihat endpoint VPC di tab Basic Information.

    • Untuk mengakses kunci melalui jaringan publik, aktifkan akses jaringan publik lalu lihat endpoint publiknya. Untuk detailnya, lihat Aktifkan akses jaringan publik.

  4. Peroleh kredensial akses.

    Simpan ID AccessKey dan Rahasia AccessKey saat membuat AccessKey untuk Akun Alibaba Cloud atau Pengguna RAM Anda. Untuk detailnya, lihat Buat AccessKey.

Local key

Saat Encryption Method dalam konfigurasi enkripsi kolom database Anda diatur ke Local Key, buat MEK. Contoh: 00112233445566778899aabbccddeeff.

Metode umum pembuatan mencakup generator kata sandi atau fungsi acak dalam bahasa pemrograman.

Contohnya:

  • Di Linux, gunakan tool OpenSSL bawaan dengan menjalankan openssl rand -hex 16 untuk menghasilkan kunci.

  • Di Windows, instal paket perangkat lunak OpenSSL.

Petunjuk integrasi klien

Penting

Gunakan JDK 1.8 atau versi lebih baru untuk Java.

Di sisi klien, ganti driver koneksi database ke EncJDBC, perbarui URL koneksi database, dan tentukan MEK untuk mengakses teks biasa dari kolom database terenkripsi.

1. Instal dependensi

Tambahkan dependensi berikut ke file konfigurasi proyek Maven Anda pom.xml.

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-cls-jdbc</artifactId>
    <version>1.0.10-3</version>
</dependency>

2. KonfigurasikanMEK untuk menghubungkan ke database

Metode berikut menjelaskan cara mengonfigurasi MEK: konfigurasi properti JDBC, konfigurasi file, dan konfigurasi URL. Jika Anda mengonfigurasi lebih dari satu metode secara bersamaan, urutan prioritasnya adalah: konfigurasi properti JDBC > konfigurasi file > konfigurasi URL.

Catatan
  • Dalam konfigurasi URL, pisahkan beberapa parameter dengan &.

  • Dalam semua konfigurasi dan metode koneksi di bawah ini, MEK diproses secara lokal di klien dan dikirim ke server secara aman menggunakan enkripsi amplop untuk mencegah kebocoran MEK.

Pilih untuk menghubungkan ke database menggunakan local key atau KMS key berdasarkan Encryption method dalam konfigurasi enkripsi kolom database Anda.

Hubungkan ke database menggunakan KMS key

Penting
  • Jika Anda menggunakan kredensial sementara STS untuk mengambil MEK yang dikelola KMS, gunakan SDK STS untuk memperoleh token kredensial sementara STS. Untuk contoh SDK STS, lihat Ikhtisar SDK STS.

  • Jangan hard code kredensial akses (ID AccessKey dan Rahasia AccessKey) langsung di kode aplikasi Anda. Contoh ini menggunakan variabel lingkungan sistem untuk mengelola kredensial akses. Untuk detailnya, lihat Konfigurasi variabel lingkungan di Linux, macOS, dan Windows.

Konfigurasi properti JDBC

JDBC standar memungkinkan Anda menyetel properti kustom menggunakan Properties saat koneksi. Contoh berikut menunjukkan cara mengonfigurasi properti JDBC dan menjalankan JDBC:

// Siapkan informasi koneksi seperti hostname, port, nama database, username, dan password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Ambil kredensial akses (ID AccessKey dan Rahasia AccessKey) dari variabel lingkungan.
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// Jika menggunakan kredensial sementara STS untuk membaca kunci KMS, juga sediakan token STS yang diperoleh.
// String stsToken = "yourSecurityToken";
// Endpoint instans KMS. Gunakan endpoint publik jika akses jaringan publik diaktifkan. Gunakan endpoint VPC untuk akses VPC.
String kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_ID", accessKeyId);
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET", accessKeySecret);
props.setProperty("ALIBABA_CLOUD_KMS_ENDPOINT", kmsEndpoint);
// props.setProperty("ALIBABA_CLOUD_STS_TOKEN", "stsToken");
// Format URL koneksi untuk MySQL: "jdbc:mysql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Muat driver EncJDBC untuk MySQL.
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Dapatkan koneksi database.
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Jalankan kueri ...
Konfigurasi URL

Anda dapat menyematkan parameter untuk mengambil kunci KMS langsung di URL, seperti yang ditunjukkan di bawah ini:

// Siapkan informasi koneksi seperti hostname, port, nama database, username, dan password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Ambil kredensial akses (ID AccessKey dan Rahasia AccessKey) dari variabel lingkungan.
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// Jika menggunakan kredensial sementara STS untuk membaca kunci KMS, juga sediakan token STS yang diperoleh.
// String stsToken = "yourSecurityToken";
// Endpoint instans KMS. Gunakan endpoint publik jika akses jaringan publik diaktifkan. Gunakan endpoint VPC untuk akses VPC.
String kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";
// Format URL koneksi untuk MySQL.
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?ALIBABA_CLOUD_ACCESS_KEY_ID=%s&ALIBABA_CLOUD_ACCESS_KEY_SECRET=%s&ALIBABA_CLOUD_KMS_ENDPOINT=%s", hostname, port, dbname, accessKeyId, accessKeySecret, kmsEndpoint);
// Dengan token STS.
// String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?ALIBABA_CLOUD_ACCESS_KEY_ID=%s&ALIBABA_CLOUD_ACCESS_KEY_SECRET=%s&ALIBABA_CLOUD_KMS_ENDPOINT=%s&ALIBABA_CLOUD_STS_TOKEN=%s", hostname, port, dbname, accessKeyId, accessKeySecret, kmsEndpoint, stsToken);
// Muat driver EncJDBC untuk MySQL.
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Dapatkan koneksi database.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Jalankan kueri ...

Hubungkan ke database menggunakan local key

Konfigurasi properti JDBC

JDBC standar memungkinkan Anda menyetel properti kustom menggunakan Properties saat koneksi. Contoh berikut menunjukkan cara mengonfigurasi properti JDBC dan menjalankan JDBC:

// Siapkan informasi koneksi seperti hostname, port, nama database, username, dan password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Master encryption key.
String mek = "00112233445566778899aabbccddeeff"; 
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);
// Format URL koneksi untuk MySQL: "jdbc:mysql:encdb://%s:%s/%s". Untuk PostgreSQL, gunakan "jdbc:postgresql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Muat driver EncJDBC untuk MySQL. Untuk PostgreSQL, gunakan "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Dapatkan koneksi database.
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Jalankan kueri ...
Konfigurasi file

Anda dapat mengimpor parameter seperti MEK yang diperlukan melalui file konfigurasi.

Catatan

Konfigurasi file hanya berlaku untuk MEK local key.

Anda dapat menyetel property bernama encJdbcConfigFile di proyek Anda dan atur nilainya ke path file konfigurasi (secara default, file encjdbc.conf digunakan). Isi file konfigurasi adalah sebagai berikut:

MEK=00112233445566778899aabbccddeeff

Anda dapat menempatkan file konfigurasi di salah satu dari dua lokasi berikut:

  • Letakkan file di direktori resources proyek Anda, seperti yang ditunjukkan di bawah ini:

    src
      main
        java
        resources
          encjdbc.conf
  • Letakkan file di direktori root proyek (direktori runtime program).

Setelah menyiapkan konfigurasi file, tidak diperlukan konfigurasi tambahan di kode Anda, seperti yang ditunjukkan di bawah ini:

// Siapkan informasi koneksi seperti hostname, port, nama database, username, dan password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Format URL koneksi untuk MySQL: "jdbc:mysql:encdb://%s:%s/%s". Untuk PostgreSQL, gunakan "jdbc:postgresql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Muat driver EncJDBC untuk MySQL. Untuk PostgreSQL, gunakan "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Dapatkan koneksi database.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Jalankan kueri ...
Konfigurasi URL

Anda dapat menyematkan parameter seperti MEK langsung di URL, seperti yang ditunjukkan di bawah ini:

// Siapkan informasi koneksi seperti hostname, port, nama database, username, dan password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
 // Master encryption key.
String mek = "00112233445566778899aabbccddeeff";
// Format URL koneksi untuk MySQL: "jdbc:mysql:encdb://%s:%s/%s?MEK=%s". Untuk PostgreSQL, gunakan "jdbc:postgresql:encdb://%s:%s/%s?MEK=%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s", hostname, port, dbname, mek);
// Muat driver EncJDBC untuk MySQL. Untuk PostgreSQL, gunakan "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Dapatkan koneksi database.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Jalankan kueri ...

3. Kueri data teks biasa dari kolom terenkripsi

Setelah berhasil terhubung ke database, operasikan seperti kueri JDBC standar. EncJDBC secara otomatis mendekripsi kolom terenkripsi dan mengembalikan data teks biasa.

Kode contoh:

// Jalankan kueri.
// Buat pernyataan kueri.
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name");
// Telusuri set hasil.
while (resultSet.next()) {
    for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
        System.out.print(rs.getString(i + 1));
        System.out.print("\t");
    }
    System.out.print("\n");
}

Contoh kode lengkap

Menggunakan properti JDBC untuk mengonfigurasi MEK local key, contoh ini mengkueri data teks biasa dari kolom terenkripsi di database RDS MySQL menggunakan akun database dengan Ciphertext Permission (JDBC Decryption).

Untuk informasi tentang konfigurasi database dalam contoh berikut, lihat Verifikasi hasil enkripsi kolom dalam Contoh enkripsi kolom database RDS MySQL.

Catatan

Contoh ini menggunakan Maven versi 3.9.9 dan alat pengembangan IntelliJ IDEA Community Edition 2024.1.2.

import java.sql.*;
import java.util.Properties;
public class EncryptedColumnAccess {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // Perbarui informasi koneksi berikut (hostname, port, nama database, username, password) dengan detail instans Anda.
        String hostname = "rm-******.mysql.rds.aliyuncs.com";
        String port = "3306";
        String dbname = "sddp_em_db";
        String username = "sddp_em03";
        String password = "******";
        // Hanya contoh. Gunakan kunci yang lebih kompleks di lingkungan produksi.
        String mek="00112233445566778899aabbccddeeff";
        Properties props = new Properties();
        props.setProperty("user", username);
        props.setProperty("password", password);
        props.setProperty("MEK", mek);
        String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
        // Muat driver EncJDBC.
        Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
        // Dapatkan koneksi database.
        Connection connection = DriverManager.getConnection(dbUrl, props);
        // Jalankan kueri.
        try {
            // Buat pernyataan kueri.
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
            // Telusuri set hasil.
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("username");
                String phone = resultSet.getString("phone");
                // Proses bidang lain berdasarkan skema tabel Anda.
                System.out.println("ID: " + id + ", Name: " + name + ", Phone: " + phone);
            }
            // Tutup resource.
            resultSet.close();
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Output contoh:

ID: 1, Name: username008808, Phone: 15xxx95
ID: 2, Name: username187643, Phone: 15xxx81