全部产品
Search
文档中心

ApsaraDB RDS:Gunakan driver enkripsi kolom berbasis JDBC

更新时间:Jul 02, 2025

Jika Anda ingin menggunakan aplikasi Java untuk mengakses kolom terenkripsi pada instance ApsaraDB RDS for PostgreSQL, Anda dapat memanfaatkan driver enkripsi kolom berbasis JDBC yang disediakan oleh Alibaba Cloud. Dengan kunci enkripsi utama (MEK) yang sesuai, driver ini secara otomatis mendekripsi ciphertext dan mengembalikan plaintext. Proses ini transparan bagi aplikasi Anda, sehingga hanya diperlukan beberapa penyesuaian pada kode aplikasi untuk menghubungkan ke kolom terenkripsi.

Prasyarat

  • Fitur enkripsi kolom telah diaktifkan.

    Catatan

    Setelah mengaktifkan fitur enkripsi kolom, sistem secara otomatis menginstal ekstensi rds_encdb pada instance RDS. Anda dapat mengeksekusi SELECT EXISTS (SELECT * FROM pg_extension WHERE extname = 'rds_encdb'); Pernyataan SQL untuk memeriksa status ekstensi rds_encdb.

  • Informasi koneksi untuk instance RDS dengan fitur enkripsi kolom telah diperoleh. Informasi ini mencakup Titik akhir (host), nomor port (port), nama instance (dbname), nama pengguna (username), dan kata sandi (password). Untuk detail lebih lanjut tentang cara memperoleh Titik akhir internal dan publik dari instance RDS, lihat Lihat dan ubah Titik akhir dan nomor port.

  • Izin ciphertext permission (JDBC decryption) telah diberikan kepada akun yang diperlukan. Untuk informasi lebih lanjut, lihat Gunakan fitur enkripsi kolom.

Catatan penggunaan

  • Simpan MEK Anda dan pastikan tetap rahasia.

  • Gunakan JDK 1.8 atau versi yang lebih baru.

Prosedur

Catatan

Contoh ini menggunakan proyek Java yang disiapkan dengan Maven.

Langkah 1: Konfigurasikan dependensi Maven

Tambahkan dependensi berikut ke file pom.xml dalam 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 menggunakan driver enkripsi kolom berbasis JDBC untuk mengakses kolom terenkripsi, konfigurasikan parameter yang diperlukan, termasuk MEK dan URL untuk menghubungkan ke instance RDS.

Pengaturan atau parameter

Contoh (tipe string)

Deskripsi

MEK

00112233445566778899aabbccddeeff

MEK yang ditentukan oleh pemilik data.

  • Pembuatan MEK: Anda dapat menggunakan alat pembuatan kata sandi seperti OpenSSL atau openssl rand -hex 16, memanggil fungsi acak dalam bahasa pemrograman, atau menggunakan layanan manajemen kunci pihak ketiga (KMS) untuk memperoleh MEK.

  • 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 tidak menghasilkan, menyimpan, mengelola, atau mencadangkan MEK Anda. Anda harus menghasilkan MEK dan menjaganya tetap rahasia. Jika Anda kehilangan MEK Anda, Anda tidak akan dapat lagi mengakses data terenkripsi yang ada. Kami merekomendasikan agar Anda mencadangkan MEK Anda.

URL

jdbc:postgresql:encdb://%s:%s/%s

Jika Anda menggunakan driver enkripsi kolom berbasis JDBC, Anda harus menentukan URL yang dimulai dengan jdbc:postgresql:encdb://.

Konfigurasikan MEK

Berikut adalah metode yang dapat digunakan untuk mengonfigurasi MEK. Jika menggunakan lebih dari satu metode, prioritas diberikan dalam urutan berikut: konfigurasi properti JDBC, file konfigurasi, dan konfigurasi URL.

Catatan
  • Jika menggunakan metode konfigurasi URL, gunakan ampersand (&) untuk menggabungkan beberapa parameter.

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

Konfigurasi Properti JDBC

Saat menghubungkan ke instance RDS melalui antarmuka JDBC standar, konfigurasikan parameter Properties untuk menentukan properti kustom. Contoh perintah:

// Dapatkan informasi koneksi seperti Titik akhir (hostname), nomor port (port), nama instance (dbname), nama pengguna (username), dan kata sandi (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 query. ...
Konfigurasi File

Gunakan file konfigurasi untuk mengimpor parameter yang diperlukan, seperti MEK. Definisikan properti bernama encJdbcConfigFile dalam proyek dan atur nilainya ke direktori file konfigurasi. Jika tidak ditentukan, file encjdbc.conf akan digunakan secara otomatis.

Berikut adalah potongan kode yang menunjukkan isi file konfigurasi:

MEK=****

Simpan file konfigurasi di salah satu direktori berikut:

  • Direktori sumber daya proyek. image.png

  • Direktori root proyek. Direktori root adalah direktori yang digunakan oleh aplikasi pada waktu proses.

Setelah menggunakan metode file konfigurasi untuk mengonfigurasi MEK, tidak diperlukan konfigurasi tambahan pada aplikasi. Contoh kode:

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

String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s", hostname, port, dbname);
Connection connection = DriverManager.getConnection(dbUrl, username, password);

// ... Mulai query. ...
Konfigurasi URL

Konfigurasikan parameter MEK dan ENC_ALGO dalam URL. Contoh kode:

// Dapatkan informasi koneksi seperti Titik akhir (hostname), nomor port (port), nama instance (dbname), nama pengguna (username), dan kata sandi (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 query. ...

Contoh kode lengkap

Potongan kode berikut menunjukkan cara menggunakan properti JDBC untuk mengonfigurasi MEK. Sebelum menggunakan driver enkripsi kolom berbasis JDBC untuk mengakses kolom terenkripsi, selesaikan pengaturan enkripsi kolom pada instance RDS Anda.

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, termasuk hostname, port, dbname, username, dan password, sesuai dengan kebutuhan bisnis Anda.
        String hostname = "pgm-****.pg.rds.aliyuncs.com"; // Titik akhir instance RDS. Anda harus menggunakan Titik akhir yang sebenarnya.
        String port = "5432"; // Nomor port database. Anda harus menggunakan nomor port yang sebenarnya.
        String dbname = "testdb"; // Nama database. Anda harus menggunakan nama database yang sebenarnya.
        String username = "user"; // Nama pengguna akun yang digunakan untuk masuk ke database. Anda harus menggunakan nama pengguna yang memiliki izin ciphertext permission (JDBC decryption).
        String password = "password"; // Kata sandi akun yang digunakan untuk masuk ke database.
        
        // Contoh MEK. Kami merekomendasikan agar Anda menggunakan MEK yang kuat untuk memastikan 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 yang digunakan untuk menghubungkan ke database.
        String dbUrl = String.format("jdbc:postgresql:encdb://%s:%s/%s", hostname, port, dbname);

        // Gunakan DriverManager untuk mendapatkan koneksi database.
        Connection connection = DriverManager.getConnection(dbUrl, props);

        // Jalankan query untuk mendapatkan data dalam 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.
        }

        // Nonaktifkan sumber daya.
        rs.close();  // Tutup set hasil.
        connection.close(); // Tutup koneksi.
    }
}