All Products
Search
Document Center

Database Autonomy Service:Integrasikan EncJDBC

Last Updated:Aug 28, 2026

Untuk mengakses data di kolom yang dilindungi enkripsi kolom dari aplikasi Java, gunakan driver EncJDBC untuk terhubung ke database Anda. EncJDBC mengambil teks biasa dari kolom terenkripsi dengan konfigurasi minimal.

Saat Anda menyediakan kunci enkripsi utama (master encryption key), seluruh tautan transmisi data dienkripsi. Klien EncJDBC secara otomatis mendekripsi data dan mengembalikan teks biasa yang dapat ditampilkan oleh aplikasi Anda dengan perubahan kode minimal.

Prasyarat

  • Anda telah menjalankan pemindaian deteksi data sensitif untuk menemukan kolom yang memerlukan enkripsi.

  • Anda telah mengonfigurasi enkripsi kolom untuk database target dan memberikan izin kepada akun database untuk Ciphertext Permission (JDBC Decryption). Untuk instruksi lengkapnya, lihat enkripsi kolom.

  • Detail koneksi instans: hostname, port, nama database, username, dan password.

Buat MEK

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

Berdasarkan key type yang Anda pilih saat mengonfigurasi enkripsi kolom, Anda dapat menggunakan KMS Key atau membuat local key sebagai MEK untuk mendekripsi database.

KMS key

Penting

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

Dapatkan titik akhir 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 tertentu. Untuk detailnya, lihat Manage RAM user permissions.

  3. Dapatkan titik akhir 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 titik akhir VPC di tab Basic Information.

    • Untuk mengakses kunci melalui jaringan publik, aktifkan akses jaringan publik lalu lihat titik akhir publik. Untuk detailnya, lihat Enable public network access.

  4. Dapatkan kredensial akses.

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

Local key

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

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

Contohnya:

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

  • Di Windows, instal paket perangkat lunak OpenSSL.

Instruksi 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 terhubung 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 terhubung ke database menggunakan local key atau KMS key berdasarkan Encryption method dalam konfigurasi enkripsi kolom database Anda.

Terhubung ke database menggunakan KMS key

Penting
  • Jika Anda menggunakan kredensial temporary STS untuk mengambil MEK yang dikelola KMS, gunakan SDK STS untuk mendapatkan token kredensial temporary STS. Untuk contoh SDK STS, lihat STS SDK overview.

  • 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 Configure environment variables on Linux, macOS, and 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 temporary STS untuk membaca kunci KMS, berikan juga token STS yang diperoleh.
// String stsToken = "yourSecurityToken";
// Titik akhir instans KMS. Gunakan titik akhir publik jika akses jaringan publik diaktifkan. Gunakan titik akhir 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 temporary STS untuk membaca kunci KMS, berikan juga token STS yang diperoleh.
// String stsToken = "yourSecurityToken";
// Titik akhir instans KMS. Gunakan titik akhir publik jika akses jaringan publik diaktifkan. Gunakan titik akhir 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 ...

Terhubung 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 dalam 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 waktu proses program).

Setelah menyiapkan konfigurasi file, tidak diperlukan konfigurasi tambahan dalam 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");
}

Pemecahan Masalah

IllegalAccessError: cannot access class com.sun.crypto.provider.SunJCE

Galat ini terjadi karena versi JDK yang lebih baru membatasi akses lintas modul secara default. Tambahkan opsi VM berikut saat menjalankan program Anda:

--add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMED

failed in mek provision: gcmEncrypt error

Ini adalah masalah yang diketahui pada Oracle JDK. Gunakan salah satu solusi berikut:

  • Beralih ke Amazon Corretto — distribusi OpenJDK drop-in yang tidak memiliki masalah ini.

  • Tambahkan penyedia keamanan BouncyCastle ke Oracle JDK:

    1. Temukan direktori instalasi JDK Anda.

    2. Buka <jdk-path>/conf/security/java.security.

    3. Di bagian List of providers and their preference orders, tambahkan: `` security.provider.14=org.bouncycastle.jce.provider.BouncyCastleProvider ``