Panduan ini menjelaskan cara menghubungkan dan menggunakan Fully Encrypted Database dari aplikasi klien.
Prasyarat
Anda telah mengaktifkan Fully Encrypted Database. Untuk informasi selengkapnya, lihat Aktifkan Fully Encrypted Database.
Anda telah menentukan kolom mana yang berisi data sensitif. Untuk informasi selengkapnya, lihat Tentukan atau konversi data sensitif.
Dapatkan detail koneksi database: hostname, port, nama database, username, dan password. Untuk petunjuk cara menemukan titik akhir publik dan internal untuk instans Anda, lihat Lihat atau modifikasi titik akhir koneksi dan port.
Aplikasi yang dijelaskan dalam artikel ini dikembangkan dengan menggunakan Java. Pastikan Anda memiliki lingkungan pengembangan Java. Kami merekomendasikan agar Anda menggunakan Java versi
1.8atau yang lebih baru, Maven versi3.9.2, danIntelliJ IDEA Community Edition 2022.3.2sebagai tool pengembangan.
Catatan
Simpan master key (MEK) Anda secara aman.
Contoh klien
Fitur Fully Encrypted Database mengenkripsi data sensitif dalam hasil kueri. Untuk memungkinkan aplikasi Anda memproses data terenkripsi, hubungkan menggunakan salah satu metode akses klien berikut:
Metode akses | Deskripsi | Perubahan kode | |
Application | EncJDBC | Otomatis mendeteksi tipe data terenkripsi dan menangani enkripsi serta dekripsi. | (Direkomendasikan) Hampir tidak memerlukan perubahan pada kode logika bisnis Anda. |
EncDB SDK | Anda harus memanggil fungsi enkripsi dan dekripsi dari EncDB SDK untuk memproses teks biasa atau ciphertext. | Diperlukan. | |
psql command-line tool | Terhubung langsung ke database untuk kueri. Hanya ciphertext untuk kolom terenkripsi yang ditampilkan. | Hanya untuk kueri. Tidak diperlukan modifikasi kode karena metode ini bukan untuk pengembangan aplikasi. | |
Visual interaction tools seperti Konsol DMS | |||
EncJDBC
Unduh driver dan dependensi
Unduh driver EncJDBC.
EncJDBCbergantung pada driver PostgreSQL yang disediakan komunitas untuk bekerja.Versi minor RDS PostgreSQL
Versi plugin sisi server
Dependensi klien
20230830 atau yang lebih baru
1.1.13 atau yang lebih baru
Konfigurasikan dependensi Maven.
CatatanPanduan ini menggunakan proyek Maven sebagai contoh.
Jalankan perintah berikut untuk menginstal paket dependensi
EncJDBCke repositori lokal Anda:mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=<jar_name> -Dversion=<jar_version> -Dpackaging=jar -Dfile=<jar_filename>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.jarCatatanDalam contoh ini, paket dependensi EncDB berada di direktori
D:\encdb\libs.Contoh ini menggunakan Maven versi
3.9.2. Jika Anda mengalami error instalasi, tingkatkan versi Maven Anda dan coba lagi.
Setelah menginstal dependensi
EncJDBCdi repositori lokal, Anda perlu menambahkan dependensi berikut ke file 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 does not support java 1.8 since 1.5.0 --> <version>1.4.0</version> </dependency> ... </dependencies>
Contoh kueri klien
Kode yang ditampilkan dalam contoh ini hanya untuk tujuan demonstrasi. Jangan atur password atau mek dalam teks biasa di kode produksi Anda. Kami merekomendasikan agar Anda menggunakan metode lain, seperti file konfigurasi eksternal atau variabel lingkungan, untuk menangani nilai-nilai ini lalu mereferensikannya dalam kode Anda.
Konfigurasi URL
Anda dapat menggunakan
EncJDBCseperti JDBC lainnya. Namun, pertama-tama Anda perlu mengonfigurasi informasi berikut terkait keamanan data Anda diEncJDBC.// Siapkan detail koneksi Anda: hostname, port, nama database (dbname), username, dan password. // Untuk detail selengkapnya, lihat bagian parameter 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); // ... Jalankan kueri ...CatatanDalam konfigurasi URL, Anda dapat menggabungkan beberapa parameter dengan
&.Parameter
mekdan parameter lain diproses secara lokal di klien dan didistribusikan secara aman ke server menggunakan enkripsi amplop, memastikan bahwamektidak pernah bocor.
Contoh kode lengkap
// Ganti hostname, port, nama database (dbname), username, dan password dengan detail instans Anda. String hostname = "hostname"; String port = "port"; String dbname = "db"; String username = "user"; String password = "password"; String mek="00112233445566778899aabbccddeeff"; // Ini adalah contoh. Gunakan kunci yang lebih kompleks di produksi. String encAlgo="SM4_128_CBC"; 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); // 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 contoh:
1, name, 1234, 12.34, aliyun
Contoh kode EncJDBC di atas menunjukkan bahwa Anda hanya perlu memodifikasi pemuatan driver dan konfigurasi URL. Sisanya identik dengan akses database standar. Anda tidak perlu memodifikasi kode terkait bisnis apa pun.
EncDB SDK
Unduh driver dan dependensi
Unduh driver EncDB SDK.
EncDB SDKbergantung pada driver PostgreSQL yang disediakan komunitas.Versi minor RDS PostgreSQL
Versi plugin sisi server
Dependensi klien
20230830 atau yang lebih baru
1.1.13 atau yang lebih baru
Konfigurasikan dependensi Maven.
CatatanPanduan ini menggunakan proyek Maven sebagai contoh.
Jalankan perintah berikut untuk menginstal paket dependensi
EncDB SDKke repositori lokal Anda:mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=<jar_name> -Dversion=<jar_version> -Dpackaging=jar -Dfile=<jar_filename>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.jarCatatanDalam contoh ini, paket dependensi EncDB berada di path
D:\encdb\libs.Contoh ini menggunakan Maven versi
3.9.2. Jika Anda mengalami error instalasi, tingkatkan versi Maven Anda dan coba lagi.
Setelah menginstal dependensi
EncDB SDKdi repositori lokal Anda, Anda perlu menambahkan dependensi berikut ke file 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>
Contoh kueri klien
Kode dalam contoh ini hanya untuk tujuan demonstrasi. Jangan atur password atau mek dalam teks biasa di kode produksi Anda. Sebagai gantinya, gunakan file konfigurasi eksternal atau variabel lingkungan dan referensikan dalam kode Anda.
Konfigurasi SDK
Sebelum mengirim atau menerima ciphertext, Anda perlu menggunakan
EncDB SDKuntuk mengenkripsi dan mendekripsi data.EncDB SDKmenyediakan antarmuka bagi Anda untuk mengonfigurasi parameter keamanan data saat menginisialisasi objek SDK. Biasanya, Anda hanya perlu mengonfigurasi master key (setMek) dan algoritma enkripsi yang diinginkan (setEncAlgo). Kami merekomendasikan agar Anda menggunakan konfigurasi default untuk semua parameter lainnya.// Siapkan detail koneksi Anda: hostname, port, nama database (dbname), username, dan password. // Buat koneksi database menggunakan versi JDBC apa pun. 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 antarmuka enkripsi/dekripsi. // byte[] cipherBytes = cryptor.encrypt(...); // XXX value = cryptor.decryptXXX(...): // ... Jalankan kueri ...CatatanParameter
mekdan parameter lain diproses secara lokal di klien dan didistribusikan secara aman ke server menggunakan enkripsi amplop, memastikan bahwamektidak pernah bocor.Contoh kode lengkap
// Ganti hostname, port, nama database (dbname), username, dan password dengan detail instans Anda. String hostname = "hostname"; String port = "port"; String dbname = "db"; String username = "user"; String password = "password"; // Buat koneksi database. 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 contoh. Gunakan kunci yang lebih kompleks di produksi. 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 contoh:
1, name, 1234, 12.34, aliyun
Referensi SDK
Ikhtisar modul SDK Java
EncDB SDK terutama terdiri dari modul fungsional Java berikut:
psql CLI
Fully Encrypted Database mendukung kueri langsung dari command line, seperti menggunakan command line psql untuk menjalankan SELECT * FROM example;.
postgres=# \x
Expanded display is on.
postgres=# SELECT * FROM example;
-[ RECORD 1 ]-----------------------------------------------------------
id | 1
name | name
price | \xac0900ecbd4efc9f36eaf1c17f1ef928a50c26c73d4ac35788f543a7dd0b2fc752459e
miles | \x931900f561358e7a92086b69d3b423fe453466a7ec556387639699153bef078857f99c
secret | \x1d3900a4ffe264f4dc6d0138106869bc09387a500ce150501d60744f404e22a5d9aa62
postgres=#Seperti yang Anda lihat, kolom id dan name berada dalam teks biasa, sedangkan kolom price, miles, dan secret berada dalam ciphertext. Data terenkripsi tidak dapat dilihat di server, yang memberikan perlindungan efektif terhadap ancaman keamanan eksternal maupun internal dan menjaga data Anda tetap aman setiap saat.
Konsol DMS
Anda dapat melakukan kueri database langsung dari tool interaksi visual, seperti Konsol DMS.
Jalankan kueri SELECT * FROM example;. Hasilnya sebagai berikut:
id | name | price | miles | secret
---+------+--------------------------------------------------------------------------+--------------------------------------------------------------------------+--------------------------------------------------------------------------
1 | name | \xac0900ecbd4efc9f36eaf1c17f1ef928a50c26c73d4ac35788f543a7dd0b2fc752459e | \x931900f561358e7a92086b69d3b423fe453466a7ec556387639699153bef078857f99c | \x1d3900a4ffe264f4dc6d0138106869bc09387a500ce150501d60744f404e22a5d9aa62Seperti yang Anda lihat, kolom id dan name berupa teks biasa, dan kolom price, miles, dan secret berupa ciphertext.
FAQ
T: Koneksi ke database gagal dengan error berikut:
org.postgresql.util.PSQLException: ERROR: db_process_msg_api: process message failure - returned 0xf7070000.J: Kode kesalahan 0xf7070000 menunjukkan kegagalan impor MEK. Hal ini dapat terjadi jika akun yang sama mencoba menghubungkan ke database terenkripsi yang sama dengan MEK berbeda. Mengubah master key membuat data yang dienkripsi dengan kunci asli menjadi tidak dapat diakses. Pastikan Anda menggunakan kunci asli untuk menghubungkan ke database.
T: Saat menjalankan program saya, saya mendapatkan error
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. Bagaimana cara memperbaikinya?J: Error ini mungkin disebabkan oleh masalah izin antar-modul akibat versi JDK yang tinggi. Untuk menyelesaikan masalah izin akses, tambahkan parameter opsi VM
--add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMEDsaat runtime, yang mengeksporcom.sun.crypto.providerke modul unnamed.