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
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:
Masuk ke konsol menggunakan Akun Alibaba Cloud atau Pengguna RAM.
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 16untuk menghasilkan kunci.Di Windows, instal paket perangkat lunak OpenSSL.
Instruksi integrasi klien
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.
Dalam konfigurasi URL, pisahkan beberapa parameter dengan
&.Dalam semua konfigurasi dan metode koneksi di bawah ini,
MEKdiproses secara lokal di klien dan dikirim ke server secara aman menggunakan enkripsi amplop untuk mencegah kebocoranMEK.
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
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.
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=00112233445566778899aabbccddeeffAnda 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.confLetakkan 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:
-
Temukan direktori instalasi JDK Anda.
-
Buka
<jdk-path>/conf/security/java.security. -
Di bagian
List of providers and their preference orders, tambahkan: ``security.provider.14=org.bouncycastle.jce.provider.BouncyCastleProvider``
-