Topik ini menjelaskan cara menggunakan fitur basis data selalu rahasia untuk instance ApsaraDB RDS for PostgreSQL dari klien.
Prasyarat
Fitur basis data selalu rahasia harus diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan Fitur Basis Data Selalu-Rahasia.
Data sensitif telah didefinisikan. Untuk informasi lebih lanjut, lihat Tentukan Data Sensitif.
Informasi koneksi ke basis data selalu rahasia telah diperoleh. Sebelum menggunakan fitur ini dari klien, Anda harus mendapatkan informasi seperti nama domain (host), nomor port (port), nama basis data (dbname), nama pengguna (username), dan kata sandi (password). Untuk informasi lebih lanjut tentang cara memperoleh titik akhir internal dan publik dari instance RDS, lihat Lihat dan Ubah Titik Akhir serta Nomor Port Instance ApsaraDB RDS for PostgreSQL.
Dalam topik ini, aplikasi Java digunakan sebagai contoh. Pastikan lingkungan pengembangan Java telah diinstal. Kami merekomendasikan penggunaan Java versi
1.8atau yang lebih baru, Maven versi3.9.2, danIntelliJ IDEA Community Edition 2022.3.2.
Catatan Penggunaan
Simpan master encryption key (MEK) Anda dan jaga kerahasiaannya.
Contoh
Fitur ini mengenkripsi data sensitif dalam hasil query. Anda dapat menggunakan fitur ini melalui jenis klien berikut:
Metode Koneksi | Deskripsi | Pengubahan kode bisnis diperlukan | |
Aplikasi | EncJDBC | EncJDBC secara otomatis mengidentifikasi tipe data untuk enkripsi dan mengenkripsi atau mendekripsi data. | Tidak. Metode ini direkomendasikan. |
EncDB SDK | Anda harus memanggil fungsi enkripsi atau dekripsi yang disediakan oleh EncDB SDK untuk mengenkripsi atau mendekripsi data di klien. | Ya. | |
psql | Alat psql adalah alat baris perintah yang memungkinkan Anda menanyakan data dalam basis data. psql hanya memperoleh data teks terenkripsi. | Tidak. Anda tidak perlu memodifikasi kode bisnis karena psql hanya digunakan untuk query. | |
Alat visual dan interaktif seperti konsol Data Management (DMS) | |||
EncJDBC
Unduh driver dan konfigurasikan dependensi
Unduh driver EncJDBC.
EncJDBCbergantung pada driver PostgreSQL komunitas.Versi mesin minor instance RDS
Versi EncDB pada instance RDS
Paket dependensi EncDB di klien
20230830 atau lebih baru
1.1.13 atau lebih baru
Konfigurasikan dependensi Maven.
CatatanBagian ini menggunakan Maven untuk mengonfigurasi klien.
Jalankan perintah berikut untuk menginstal paket dependensi
EncJDBCke repositori lokal:mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=<Nama paket JAR yang diinstal> -Dversion=<Versi paket JAR yang diinstal> -Dpackaging=jar -Dfile=<Nama file paket JAR yang diinstal>Contoh:
mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=encjdbc -Dversion=1.0.6 -Dpackaging=jar -Dfile=D:\encdb\libs\encjdbc-1.0.6.jarCatatanPaket dependensi EncDB disimpan di jalur
D:\encdb\libs.Contoh ini menggunakan Maven versi
3.9.2. Jika Anda menggunakan versi lain, tingkatkan versi Maven dan coba lagi.
Setelah menginstal paket dependensi
EncJDBCdi repositori lokal, tambahkan dependensi berikut ke file konfigurasi pom.xml proyek Maven Anda:<dependencies> ... <dependency> <groupId>com.alibaba.encdb</groupId> <artifactId>encjdbc</artifactId> <version>1.0.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.62</version> </dependency> <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.62</version> </dependency> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.23</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>24.1.1-jre</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.4</version> </dependency> <dependency> <groupId>org.jgrapht</groupId> <artifactId>jgrapht-core</artifactId> <!-- jgrapht tidak mendukung java 1.8 sejak 1.5.0 --> <version>1.4.0</version> </dependency> ... </dependencies>
Query data dari klien (kode sampel)
Bagian ini menyediakan kode sampel untuk tujuan demonstrasi. Dalam kode bisnis aktual, jangan atur parameter password dan mek sebagai nilai teks biasa. Gunakan metode seperti file konfigurasi eksternal atau variabel lingkungan untuk mengonfigurasi parameter sebelum merujuknya dalam kode.
Deskripsi Konfigurasi URL
Anda dapat menggunakan
EncJDBCseperti Java Database Connectivity (JDBC). Sebelum menggunakanEncJDBC, lakukan konfigurasi berikut untuk memastikan keamanan data:// Informasi koneksi seperti nama domain (hostname), nomor port (port), nama basis data (dbname), nama pengguna (username), dan kata sandi (password). // Untuk informasi lebih lanjut, lihat bagian "Parameter terkait keamanan data". String mek=...; String encAlgo=...; String dbUrl = String.format("encjdbc:postgresql://%s:%s/%s?mek=%s&enc_algo=%s", hostname, port, dbname, mek, encAlgo); Class.forName("com.alibaba.encdb.encjdbc.EncDriver"); Connection dbConnection = DriverManager.getConnection(dbUrl, username, password); // ... Mulai query. ...CatatanGunakan ampersand (
&) untuk menggabungkan beberapa parameter.mekdan parameter lainnya dikonfigurasi di sisi klien dan ditransmisikan ke sisi server menggunakan enkripsi amplop. Proses ini memastikan kerahasiaan nilaimek.
Kode Sampel Lengkap
// Informasi koneksi seperti nama domain (hostname), nomor port (port), nama basis data (dbname), nama pengguna (username), dan kata sandi (password). Tentukan parameter berdasarkan kebutuhan bisnis 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 Anda menggunakan MEK yang lebih kompleks. String encAlgo="SM4_128_CBC"; String dbUrl = String.format("encjdbc:postgresql://%s:%d/%s?mek=%s&enc_algo=%s", hostname, port, dbname, mek, encAlgo); Class.forName("com.alibaba.encdb.encjdbc.EncDriver"); Connection dbConnection = DriverManager.getConnection(dbUrl, username, password); // buat tabel dbConnection.createStatement().executeUpdate("DROP TABLE IF EXISTS example"); dbConnection.createStatement().executeUpdate("CREATE TABLE example (id INTEGER, name VARCHAR, price enc_int4, miles enc_float4, secret enc_text, PRIMARY KEY (id))"); // masukkan data PreparedStatement stmt = dbConnection.prepareStatement("INSERT INTO example (id, name, price, miles, secret) VALUES(?,?,?,?,?)"); int price = 1234; float miles = 12.34f; String secret = "aliyun"; stmt.setInt(1, 1); stmt.setString(2, "name"); stmt.setInt(3, price); stmt.setFloat(4, miles); stmt.setString(5, secret); stmt.execute(); // periksa data teks biasa String sqlCmd = "SELECT * FROM example WHERE price > ?"; PreparedStatement stmt = dbConnection.prepareStatement(sqlCmd); stmt.setInt(1, 100); ResultSet rs = stmt.executeQuery(); while (rs.next()){ int id = rs.getInt(1); String name = rs.getString(2); int price = rs.getInt(3); float miles = rs.getFloat(4); String secret = rs.getString(5); System.out.println(id + ", " + name + ", " + price + ", " + miles + ", " + secret); }Output Sampel:
1, name, 1234, 12.34, aliyun
Dalam contoh EncJDBC, hanya pemuatan driver dan konfigurasi URL yang dimodifikasi. Operasi data lainnya dapat dilakukan seperti operasi basis data umum tanpa memodifikasi kode bisnis apa pun.
EncDB SDK
Unduh driver dan konfigurasikan dependensi
Unduh driver EncDB SDK.
EncDB SDKbergantung pada driver PostgreSQL komunitas.Versi mesin minor instance RDS
Versi EncDB pada instance RDS
Paket dependensi EncDB di klien
20230830 atau lebih baru
1.1.13 atau lebih baru
Konfigurasikan dependensi Maven.
CatatanBagian ini menggunakan Maven untuk mengonfigurasi klien.
Jalankan perintah berikut untuk menginstal paket dependensi
EncDB SDKke repositori lokal:mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=<Nama paket JAR yang diinstal> -Dversion=<Versi paket JAR yang diinstal> -Dpackaging=jar -Dfile=<Nama file paket JAR yang diinstal>Contoh:
mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=libencdb -Dversion=1.2.12 -Dpackaging=jar -Dfile=D:\encdb\libs\libencdb-1.2.12.jarCatatanPaket dependensi EncDB disimpan di jalur
D:\encdb\libs.Contoh ini menggunakan Maven versi
3.9.2. Jika Anda menggunakan versi lain, tingkatkan versi Maven dan coba lagi.
Setelah menginstal paket dependensi
EncDB SDKdi repositori lokal, tambahkan dependensi berikut ke file konfigurasi pom.xml proyek Maven Anda:<dependencies> ... <dependency> <groupId>com.alibaba.encdb</groupId> <artifactId>libencdb</artifactId> <version>1.2.12</version> </dependency> <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.70</version> </dependency> <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.70</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.23</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency> ... </dependencies>
Query data dari klien (kode sampel)
Bagian ini menyediakan kode sampel untuk tujuan demonstrasi. Dalam kode bisnis aktual, jangan atur parameter password dan mek sebagai nilai teks biasa. Gunakan metode seperti file konfigurasi eksternal atau variabel lingkungan untuk mengonfigurasi parameter sebelum merujuknya dalam kode.
Deskripsi Konfigurasi SDK
Sebelum mengelola data teks terenkripsi yang Anda terima atau kirim, gunakan
EncDB SDKuntuk mengenkripsi atau mendekripsi data.EncDB SDKmenyediakan API yang diperlukan untuk mengonfigurasi parameter terkait keamanan data saat menginisialisasi objek SDK. Secara umum, cukup konfigurasikan MEK yang ditentukan oleh setMek dan algoritma enkripsi yang diperlukan oleh setEncAlgo. Gunakan pengaturan default untuk parameter lainnya.// Dapatkan informasi koneksi seperti nama domain (hostname), nomor port (port), nama basis data (dbname), nama pengguna (username), dan kata sandi (password). // Buat koneksi basis data. Semua versi JDBC didukung. String dbUrl = String.format("jdbc:postgresql://%s:%s/%s?binaryTransfer=true", hostname, port, dbname); Class.forName("org.postgresql.Driver"); Connection dbConnection = DriverManager.getConnection(dbUrl, username, password); // Inisialisasi SDK. String mek=...; Constants.EncAlgo encAlgo=...; EncdbSDK sdk = EncdbSDKBuilder.newInstance() .setDbConnection(dbConnection) .setMek(mek) .setEncAlgo(encAlgo) .build(); Cryptor cryptor = sdk.getCryptor(); // Panggil operasi API untuk enkripsi atau dekripsi data. // byte[] cipherBytes = cryptor.encrypt(...); // XXX value = cryptor.decryptXXX(...): // ... Mulai query. ...Catatanmekdan parameter lainnya dikonfigurasi di sisi klien dan ditransmisikan ke sisi server menggunakan enkripsi amplop. Proses ini memastikan kerahasiaan nilaimek.Kode Sampel Lengkap
// Perbarui informasi koneksi seperti nama domain (hostname), nomor port (port), nama basis data (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"; // Buat koneksi basis data. String dbUrl = String.format("jdbc:postgresql://%s:%s/%s?binaryTransfer=true", hostname, port, dbname); Class.forName("org.postgresql.Driver"); Connection dbConnection = DriverManager.getConnection(dbUrl, username, password); // Inisialisasi SDK. String mek="00112233445566778899aabbccddeeff"; // Ini adalah nilai contoh. Kami merekomendasikan Anda menggunakan MEK yang lebih kompleks. Constants.EncAlgo encAlgo=Constants.EncAlgo.SM4_128_CBC; EncdbSDK sdk = EncdbSDKBuilder.newInstance() .setDbConnection(dbConnection) .setMek(mek) .setEncAlgo(encAlgo) .build(); Cryptor cryptor = sdk.getCryptor(); // buat tabel dbConnection.createStatement().executeUpdate("DROP TABLE IF EXISTS example"); dbConnection.createStatement().executeUpdate("CREATE TABLE example (id INTEGER, name VARCHAR, price enc_int4, miles enc_float4, secret enc_text, PRIMARY KEY (id))"); // masukkan data PreparedStatement stmt = dbConnection.prepareStatement("INSERT INTO example (id, name, price, miles, secret) VALUES(?,?,?,?,?)"); int price = 1234; float miles = 12.34f; String secret = "aliyun"; stmt.setInt(1, 1); stmt.setString(2, "name"); stmt.setBytes(3, cryptor.encrypt("example", "price", price)); stmt.setBytes(4, cryptor.encrypt("example", "miles", miles)); stmt.setBytes(5, cryptor.encrypt("example", "secret", secret)); stmt.execute(); // periksa data teks biasa String sqlCmd = "SELECT * FROM example WHERE price > ?"; stmt = dbConnection.prepareStatement(sqlCmd); stmt.setBytes(1, cryptor.encrypt("example", "price", 100)); ResultSet rs = stmt.executeQuery(); while (rs.next()) { int id = rs.getInt(1); String name = rs.getString(2); price = cryptor.decryptInt(rs.getBytes(3)); miles = cryptor.decryptFloat(rs.getBytes(4)); String text = cryptor.decryptString(rs.getBytes(5)); System.out.println(id +", " + name + ", " + price + ", " + miles + ", " + text); }Output Sampel:
1, name, 1234, 12.34, aliyun
Referensi
Pengenalan Modul Java SDK
EncDB SDK mencakup modul fitur Java berikut:
psql
Anda dapat menggunakan psql untuk menanyakan data dalam basis data selalu rahasia. Misalnya, jalankan pernyataan SELECT * FROM example; menggunakan psql.

Dalam output sebelumnya, id dan name adalah kolom teks biasa, sedangkan price, miles, dan secret adalah kolom teks terenkripsi. Data terenkripsi tidak dapat dilihat pada instance RDS, membantu melindungi data Anda dari ancaman keamanan di dalam dan luar cloud setiap saat.
Konsol DMS
Anda dapat menggunakan alat visual dan interaktif seperti Konsol DMS untuk menanyakan data dalam basis data selalu rahasia.

Dalam gambar sebelumnya, id dan name adalah kolom teks biasa, sedangkan price, miles, dan secret adalah kolom teks terenkripsi.
Tanya Jawab Umum
Apa yang harus saya lakukan jika pesan kesalahan
org.postgresql.util.PSQLException: ERROR: db_process_msg_api: process message failure - returned 0xf7070000muncul ketika saya terhubung ke basis data saya?Kode kesalahan 0xf7070000 menunjukkan bahwa MEK Anda tidak dapat diimpor. Data yang dienkripsi menggunakan satu MEK tidak dapat diakses menggunakan MEK lain. Jika Anda menggunakan akun yang sama tetapi MEK berbeda untuk terhubung ke basis data selalu rahasia yang sama, kesalahan ini mungkin terjadi. Saat terhubung ke basis data selalu rahasia, gunakan MEK yang sama setiap saat.
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 @0x5c0369c4muncul ketika saya menjalankan program?Pesan kesalahan ini mungkin muncul karena masalah izin antar-modul yang terjadi ketika versi JDK lebih baru dari versi yang diperlukan. Untuk menyelesaikan kesalahan, tambahkan opsi VM
--add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMEDsaat menjalankan program untuk mengekspor com.sun.crypto.provider ke modul Unnamed.