全部产品
Search
文档中心

ApsaraDB RDS:EncJDBC

更新时间:Jul 06, 2025

Jika Anda ingin menggunakan fitur basis data selalu rahasia untuk mengenkripsi data kolom tertentu dalam tabel dan menggunakan aplikasi Java untuk terhubung ke basis data yang diperlukan, Anda dapat menggunakan EncJDBC. Ini mempermudah koneksi basis data dan menyederhanakan penggunaan fitur basis data selalu rahasia. Topik ini menjelaskan cara terhubung ke basis data selalu rahasia menggunakan EncJDBC.

Jika Anda memiliki kunci enkripsi utama (MEK), EncJDBC dapat secara otomatis mendekripsi data ciphertext dan mengembalikan data plaintext. Proses ini transparan bagi aplikasi Anda, sehingga Anda dapat menghubungkan aplikasi ke basis data selalu rahasia dengan beberapa perubahan pada kode aplikasi. Hal ini menyederhanakan penggunaan fitur basis data selalu rahasia.

Prasyarat

  • Fitur basis data selalu rahasia telah diaktifkan untuk instance ApsaraDB RDS for MySQL Anda. Untuk informasi lebih lanjut, lihat Aktifkan fitur basis data selalu rahasia.

  • Informasi koneksi untuk instance RDS dengan fitur basis data selalu rahasia diaktifkan telah diperoleh. Informasi tersebut mencakup nama domain (host), nomor port (port), nama instance (dbname), nama pengguna (username), dan kata sandi (password).

  • Aturan perlindungan data telah dikonfigurasi. Untuk informasi lebih lanjut, lihat Konfigurasikan aturan perlindungan data.

Catatan penggunaan

  • Anda harus menyimpan MEK dan menjaganya tetap rahasia.

  • Gunakan JDK 1.8 atau versi yang lebih baru.

    Catatan

    Dalam topik ini, versi Maven adalah 3.9.2, dan alat pengembangan adalah IntelliJ IDEA Community Edition 2022.3.2.

Prosedur

Langkah 1: Tambahkan dependensi Maven

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

<dependencies>
  <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-encdb-mysql-jdbc</artifactId>
    <version>1.0.9-1</version>
  </dependency>
</dependencies>

Langkah 2: Konfigurasikan EncJDBC berdasarkan contoh kode

Anda dapat menggunakan EncJDBC seperti menggunakan JDBC standar. Sebelum menggunakan EncJDBC, konfigurasikan parameter yang diperlukan, seperti MEK dan ENC_ALGO, di EncJDBC untuk keamanan data. MEK menentukan kunci enkripsi utama, sedangkan ENC_ALGO menentukan algoritma enkripsi.

Tabel berikut menjelaskan parameter dan memberikan nilai contoh.

Parameter

Contoh (tipe string)

Deskripsi

MEK

00112233445566778899aabbccddeeff

MEK yang ditentukan oleh pemilik data.

Pembuatan MEK: Anda dapat menggunakan alat pembuatan kata sandi seperti OpenSSL dan openssl rand -hex 16, memanggil fungsi acak dalam bahasa pemrograman, atau mendapatkan kunci dari Key Management Service (KMS).

Nilai valid: string heksadesimal 16-byte sepanjang 32 karakter.

Peringatan

MEK adalah kredensial utama yang Anda gunakan untuk mengakses data terenkripsi. Untuk tujuan keamanan, instance RDS yang memiliki fitur basis data selalu rahasia diaktifkan tidak menghasilkan, menyimpan, atau mencadangkan MEK Anda. Anda harus menghasilkan MEK dan menjaganya tetap rahasia. Jika Anda kehilangan MEK Anda, Anda tidak akan dapat lagi mengakses data yang dienkripsi menggunakan MEK tersebut. Kami merekomendasikan agar Anda mencadangkan MEK Anda.

ENC_ALGO

SM4_128_CBC

Algoritma enkripsi yang digunakan untuk melindungi data.

Nilai valid:

  • Algoritma yang diterima secara internasional:

    • AES_128_GCM

    • AES_128_CTR

    • AES_128_CBC

    • AES_128_ECB (tidak direkomendasikan)

  • Algoritma SM:

    • SM4_128_GCM (default)

    • SM4_128_CTR

    • SM4_128_CBC

    • SM4_128_ECB (tidak direkomendasikan)

Catatan
  • Algoritma enkripsi AES_128_ECB dan SM4_128_ECB tidak dapat memberikan keamanan tinggi. Kami merekomendasikan agar Anda memilih algoritma enkripsi lain yang memberikan keamanan lebih tinggi daripada algoritma enkripsi AES_128_ECB dan SM4_128_ECB.

  • Opsional. Nilai defaultnya adalah SM4_128_GCM.

Konfigurasikan parameter MEK dan ENC_ALGO

Berikut adalah metode yang dapat digunakan untuk mengonfigurasi parameter MEK dan ENC_ALGO. Jika Anda menggunakan lebih dari satu metode untuk mengonfigurasi parameter di JDBC, prioritasnya adalah sebagai berikut: konfigurasi properti JDBC, file konfigurasi, dan konfigurasi URL.

Catatan
  • Anda dapat menggunakan ampersand (&) untuk menggabungkan beberapa parameter.

  • Dalam metode berikut, MEK dikonfigurasi di mesin lokal sisi klien dan didistribusikan ke server menggunakan enkripsi amplop untuk memastikan bahwa MEK tidak bocor.

Konfigurasikan properti JDBC

Saat terhubung ke instance RDS dari JDBC standar, konfigurasikan pengaturan Properties. Contoh kode:

// Dapatkan informasi koneksi seperti nama domain (hostname), nomor port (port), nama instance (dbname), nama pengguna (username), dan kata sandi (password).
// ...

String mek=...;
String encAlgo=...;

Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);
props.setProperty("ENC_ALGO", encAlgo);

String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
Connection connection = DriverManager.getConnection(dbUrl, props);

// ... Mulai query. ...
Gunakan file konfigurasi

Buat file konfigurasi dan konfigurasikan parameter yang diperlukan, seperti MEK, di dalamnya. Kemudian, tentukan properti bernama encJdbcConfigFile di proyek dan atur nilainya ke direktori file konfigurasi. Jika tidak ditentukan, sistem akan menggunakan file encjdbc.conf secara default.

Isi file konfigurasi:

MEK=
ENC_ALGO=

Anda dapat menentukan direktori file konfigurasi menggunakan metode berikut:

  • Simpan file konfigurasi di direktori resources proyek. image.png

  • Simpan file konfigurasi di direktori root proyek. Direktori root adalah direktori yang digunakan oleh aplikasi saat runtime.

Setelah konfigurasi file selesai, tidak diperlukan pengaturan tambahan di aplikasi.

// Dapatkan informasi koneksi seperti nama domain (hostname), nomor port (port), nama instance (dbname), nama pengguna (username), dan kata sandi (password).
// ...

String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
Connection connection = DriverManager.getConnection(dbUrl, username, password);

// ... Mulai query. ...
Konfigurasikan URL

Anda dapat mengonfigurasi parameter MEK dan ENC_ALGO di URL.

// Dapatkan informasi koneksi seperti nama domain (hostname), nomor port (port), nama instance (dbname), nama pengguna (username), dan kata sandi (password).
// ...

String mek=...;
String encAlgo=...;

String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s&ENC_ALGO=%s", hostname, port, dbname, mek, encAlgo);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
Connection connection = DriverManager.getConnection(dbUrl, username, password);

// ... Mulai query. ...

Contoh kode lengkap konfigurasi properti JDBC

// Perbarui informasi koneksi seperti nama domain (hostname), nomor port (port), nama instance (dbname), nama pengguna (username), dan kata sandi (password) ke informasi instance Anda.
String hostname = "hostname";
String port = "port";
String dbname = "db";
String username = "user";
String password = "password";

String mek="00112233445566778899aabbccddeeff"; // Ini adalah nilai contoh. Kami merekomendasikan agar Anda menggunakan MEK yang lebih kompleks.
String encAlgo="SM4_128_CBC";

Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);
props.setProperty("ENC_ALGO", encAlgo);

String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
Connection connection = DriverManager.getConnection(dbUrl, props);

int[] intData = {1, 2, 3, 4, 5, 6};
String[] strData = {"abc", "bcd", "1", "def", "efg", "fgi"};

// buat tabel
connection.createStatement().executeUpdate("drop table if exists test");
connection.createStatement().executeUpdate("create table test (a int, b text)");

// masukkan data
for (int i = 0; i < 6; i++) {
    PreparedStatement pstmt = connection.prepareStatement("insert into test values (?,?)");
    pstmt.setInt(1, intData[i]);
    pstmt.setString(2, strData[i]);
    pstmt.executeUpdate();
}

// periksa data plaintext
ResultSet rs = connection.createStatement().executeQuery("select * from test");
while (rs.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");
}

Output:

1	abc	
2	bcd	
3	cde	
4	def	
5	efg	
6	fgi	

FAQ

  • Apa yang harus saya lakukan jika pesan kesalahan Exception in thread "main" java.lang.IllegalAccessError: class com.alibaba.encdb.common.SymCrypto (in unnamed module @0x5c0369c4) cannot access class com.sun.crypto.provider.SunJCE (in module java.base) because module java.base does not export com.sun.crypto.provider to unnamed module @0x5c0369c4 muncul saat menjalankan program?

    Pesan kesalahan ini mungkin muncul karena masalah izin antar-modul ketika versi JDK lebih baru dari yang diperlukan. Untuk menyelesaikan kesalahan ini, tambahkan opsi VM --add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMED saat menjalankan program untuk mengekspor com.sun.crypto.provider ke modul Unnamed.

  • Apa yang harus saya lakukan jika pesan kesalahan failed in mek provision: you might have an incorrect mek setting. Detail:gcmEncrypt error muncul saat menjalankan program?

    Kesalahan ini merupakan kesalahan umum di Oracle JDK. Untuk menyelesaikan kesalahan ini, gunakan salah satu metode berikut:

    • Gunakan Amazon Corretto sebagai gantinya.

    • Jika Anda menggunakan Oracle JDK, lakukan langkah-langkah berikut untuk mengonfigurasi penyedia keamanan:

      1. Temukan jalur instalasi JDK.

      2. Di direktori Installation path/conf/security/, temukan file java.security.

      3. Edit file java.security. Di bagian List of providers and their preference orders (see above):, tambahkan konten berikut:

        security.provider.14=org.bouncycastle.jce.provider.BouncyCastleProvider