Gunakan driver enkripsi kolom (JDBC) Alibaba Cloud untuk mengakses data terenkripsi di database Anda dari aplikasi Java. Driver ini menggunakan kunci enkripsi utama (MEK) yang valid untuk mendekripsi ciphertext menjadi teks biasa secara otomatis dan transparan.
Prasyarat
-
Enkripsi kolom harus diaktifkan. Untuk informasi selengkapnya, lihat enkripsi kolom.
CatatanSetelah Anda mengaktifkan enkripsi kolom, ekstensi rds_encdb akan dipasang secara default di database target. Anda dapat menjalankan pernyataan SQL berikut untuk memeriksa status ekstensi rds_encdb:
SELECT EXISTS (SELECT * FROM pg_extension WHERE extname = 'rds_encdb'); -
Anda harus memiliki informasi koneksi ke database terenkripsi, termasuk hostname, port, nama database, username, dan password. Untuk mengetahui cara memperoleh titik akhir internal atau publik suatu instans, lihat Lihat dan ubah titik akhir serta nomor port.
-
Pengguna database harus memiliki ciphertext permission (JDBC decryption) untuk enkripsi kolom. Untuk informasi selengkapnya, lihat enkripsi kolom.
Catatan penggunaan
-
Simpan
MEKsecara aman. -
Gunakan JDK 1.8 atau versi yang lebih baru.
Prosedur
Topik ini menggunakan proyek Java berbasis Maven sebagai contoh.
Langkah 1: Konfigurasikan dependensi Maven
Tambahkan dependensi berikut ke file pom.xml proyek Maven Anda.
<dependencies>
...
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-cls-jdbc</artifactId>
<version>1.0.10-1</version>
</dependency>
...
</dependencies>
Langkah 2: Konfigurasikan URL dan MEK
Sebelum mengakses data terenkripsi dengan JDBC, konfigurasikan parameter seperti MEK dan URL.
|
Parameter |
Contoh |
Deskripsi |
|
MEK |
00112233445566778899aabbccddeeff |
Kunci enkripsi utama yang ditentukan pengguna.
Peringatan
Demi keamanan, database tidak menyimpan, mengelola, menghasilkan, atau melakukan backup MEK Anda. Anda bertanggung jawab atas pembuatan dan pencadangan kunci tersebut. Kehilangan MEK akan mengakibatkan kehilangan permanen akses ke data terenkripsi Anda. |
|
URL |
jdbc:postgresql:encdb://%s:%s/%s |
Untuk menggunakan driver enkripsi kolom, ubah awalan URL menjadi |
Konfigurasikan MEK
Anda dapat mengonfigurasi MEK dengan tiga cara. Jika Anda menerapkan lebih dari satu metode dalam koneksi JDBC, prioritasnya adalah sebagai berikut: konfigurasi Properties JDBC > konfigurasi File > konfigurasi URL.
-
Pada metode konfigurasi URL, Anda dapat menggabungkan beberapa parameter menggunakan karakter ampersand (
&). -
Pada ketiga metode tersebut,
MEKdiproses secara lokal di client dan didistribusikan ke server secara aman menggunakan enkripsi amplop, sehingga tidak terpapar.
Properties JDBC
JDBC standar memungkinkan Anda mengonfigurasi atribut kustom dalam objek Properties saat membuat koneksi. Contohnya:
// Siapkan informasi koneksi, seperti hostname, port, dbname, username, dan password.
// ...
String mek="****";
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);
String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s", hostname, port, dbname);
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Mulai kueri ...
File
Anda dapat mengimpor parameter seperti MEK dari file konfigurasi. Untuk melakukannya, atur properti encJdbcConfigFile ke path file tersebut. Jika properti ini tidak diatur, driver akan menggunakan file encjdbc.conf secara default.
File konfigurasi berisi hal berikut:
MEK=****
Anda dapat menempatkan file konfigurasi di salah satu dari dua lokasi berikut:
-
Tempatkan file
encjdbc.confdi direktori resources proyek Anda. -
Tempatkan file tersebut di direktori root proyek, yaitu direktori runtime aplikasi.
Setelah MEK dikonfigurasi dalam file, tidak diperlukan kode tambahan. Contohnya:
// Siapkan informasi koneksi, seperti hostname, port, dbname, username, dan password.
// ...
String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s", hostname, port, dbname);
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Mulai kueri ...
URL
Anda dapat menyematkan parameter seperti MEK dan ENC_ALGO di dalam URL. Contohnya:
// Siapkan informasi koneksi, seperti hostname, port, dbname, username, dan password.
// ...
String mek="****";
String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s?MEK=%s", hostname, port, dbname, mek);
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Mulai kueri ...
Contoh kode
Kode berikut menunjukkan contoh lengkap konfigurasi MEK menggunakan konfigurasi Properties JDBC. Sebelum menjalankan kode ini, pastikan enkripsi kolom telah dikonfigurasi di database target.
package org.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class Main {
public static void main(String[] args) throws SQLException {
// Perbarui informasi koneksi berikut (hostname, port, dbname, username, password) sesuai dengan lingkungan aktual Anda.
String hostname = "pgm-****.pg.rds.aliyuncs.com"; // Titik akhir instans. Ganti dengan nilai aktual Anda.
String port = "5432"; // Port database. Ganti dengan nilai aktual Anda.
String dbname = "testdb"; // Nama database. Ganti dengan nilai aktual Anda.
String username = "user"; // Username database. Gunakan pengguna yang memiliki izin ciphertext (dekripsi JDBC).
String password = "password"; // Password untuk pengguna database.
// Ini adalah contoh kunci. Kami menyarankan menggunakan kunci yang lebih kuat untuk meningkatkan keamanan.
String MEK = "00112233445566778899aabbccddeeff";
// Buat properti koneksi database.
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", MEK);
// Format URL koneksi database.
String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s", hostname, port, dbname);
// Dapatkan koneksi database menggunakan DriverManager.
Connection connection = DriverManager.getConnection(dbUrl, props);
// Jalankan kueri untuk mengambil data dari tabel uji.
ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM test_table");
while (rs.next()) {
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { // Indeks kolom dimulai dari 1.
System.out.print(rs.getString(i) + "\t");
}
System.out.println(); // Baris baru.
}
// Tutup sumber daya.
rs.close(); // Tutup set hasil.
connection.close(); // Tutup koneksi.
}
}