全部产品
Search
文档中心

ApsaraDB RDS:Gunakan fitur basis data selalu rahasia dari klien

更新时间:Jul 02, 2025

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.

    Contoh Tabel Uji

    Dalam contoh berikut, kolom price, miles, dan secret merupakan data sensitif.

    CREATE TABLE example (
        id      INTEGER,
        name    VARCHAR,
        price   enc_int4,
        miles   enc_float4,
        secret  enc_text,
        PRIMARY KEY (id)
    );
  • 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.8 atau yang lebih baru, Maven versi 3.9.2, dan IntelliJ 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

  1. Unduh driver EncJDBC.

    EncJDBC bergantung 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

    encjdbc-1.0.6.jar

  2. Konfigurasikan dependensi Maven.

    Catatan

    Bagian ini menggunakan Maven untuk mengonfigurasi klien.

    1. Jalankan perintah berikut untuk menginstal paket dependensi EncJDBC ke 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.jar
      Catatan
      • Paket 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.

    2. Setelah menginstal paket dependensi EncJDBC di 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)

Peringatan

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 EncJDBC seperti Java Database Connectivity (JDBC). Sebelum menggunakan EncJDBC, 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. ...

    Parameter Terkait Keamanan Data

    Parameter

    Contoh (tipe string)

    Deskripsi

    mek

    0x00112233445566778899aabbccddeeff

    MEK yang ditentukan oleh pemilik data.

    Pembuatan MEK: Anda dapat menggunakan alat pembuatan kata sandi seperti OpenSSL dan openssl rand -hex 16, memanggil fungsi acak dalam bahasa pemrograman, atau memperoleh kunci dari Key Management Service (KMS).

    Nilai valid: string heksadesimal dengan panjang 32 karakter.

    Peringatan

    MEK adalah kredensial utama yang Anda gunakan untuk mengakses data terenkripsi. Alasan keamanan, basis data selalu rahasia tidak menghasilkan, menyimpan, dan mencadangkan MEK Anda. Anda harus menghasilkan dan menyimpan CMK Anda di lokasi yang aman. Jika Anda kehilangan MEK Anda, Anda tidak dapat lagi mengakses data yang dienkripsi menggunakan MEK tersebut. Kami merekomendasikan Anda mencadangkan MEK Anda.

    enc_algo

    SM4_128_CBC

    Algoritma enkripsi. Nilai valid:

    • Algoritma yang diterima secara internasional:

      • AES_128_GCM

      • AES_128_CBC

      • AES_128_ECB

    • Algoritma ShangMi (SM):

      • SM4_128_GCM

      • SM4_128_CBC (Ini adalah nilai default.)

      • SM4_128_ECB

    Catatan
    • Algoritma enkripsi CTR tidak didukung.

    • Algoritma enkripsi AES_128_ECB dan SM4_128_ECB tidak dapat memberikan keamanan tinggi. Kami merekomendasikan Anda memilih algoritma enkripsi lain yang memberikan keamanan lebih tinggi daripada algoritma enkripsi AES_128_ECB dan SM4_128_ECB.

    enc_scheme

    RND

    Metode enkripsi. Nilai valid:

    • RND: enkripsi probabilistik. Ini adalah nilai default.

    • DET: enkripsi deterministik.

    Catatan

    Parameter ini tidak valid jika Anda mengatur parameter enc_algo ke AES_128_ECB atau SM4_128_ECB.

    dek_gen_mode

    ENCLAVE

    Metode yang digunakan untuk menghasilkan kunci enkripsi data (DEK). Nilai valid:

    • ENCLAVE: Server basis data menghasilkan DEK di enclave tepercaya. Ini adalah nilai default.

    • LOCAL: Klien menghasilkan DEK.

    stateless

    true

    Atribut Stateless yang diterapkan pada basis data selalu rahasia. Nilai valid:

    • true: MEK yang dihasilkan tetap valid setelah klien terputus dari instance RDS. Ini adalah nilai default.

    • false: MEK yang dihasilkan menjadi tidak valid setelah klien terputus dari instance RDS.

    Catatan
    • Gunakan ampersand (&) untuk menggabungkan beberapa parameter.

    • mek dan parameter lainnya dikonfigurasi di sisi klien dan ditransmisikan ke sisi server menggunakan enkripsi amplop. Proses ini memastikan kerahasiaan nilai mek.

  • 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

  1. Unduh driver EncDB SDK.

    EncDB SDK bergantung 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

    libencdb-1.2.12.jar

  2. Konfigurasikan dependensi Maven.

    Catatan

    Bagian ini menggunakan Maven untuk mengonfigurasi klien.

    1. Jalankan perintah berikut untuk menginstal paket dependensi EncDB SDK ke 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.jar
      Catatan
      • Paket 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.

    2. Setelah menginstal paket dependensi EncDB SDK di 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)

Peringatan

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 SDK untuk mengenkripsi atau mendekripsi data.

    EncDB SDK menyediakan 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. ...

    Inisialisasi Parameter Terkait SDK

    Parameter

    Contoh (tipe string)

    Deskripsi

    Mek

    0x00112233445566778899aabbccddeeff

    MEK yang ditentukan oleh pemilik data.

    Pembuatan MEK: Anda dapat menggunakan alat pembuatan kata sandi seperti OpenSSL dan openssl rand -hex 16, memanggil fungsi acak dalam bahasa pemrograman, atau memperoleh kunci dari KMS.

    Nilai valid: String heksadesimal dengan panjang 32 karakter dan angka biner dengan panjang 16 byte.

    Peringatan

    MEK adalah kredensial utama yang Anda gunakan untuk mengakses data terenkripsi. Alasan keamanan, basis data selalu rahasia tidak menghasilkan, menyimpan, dan mencadangkan MEK Anda. Anda harus menghasilkan dan menyimpan CMK Anda di lokasi yang aman. Jika Anda kehilangan MEK Anda, Anda tidak dapat lagi mengakses data yang dienkripsi menggunakan MEK tersebut. Kami merekomendasikan Anda mencadangkan MEK Anda.

    EncAlgo

    SM4_128_CBC

    Algoritma enkripsi. Nilai valid:

    • Algoritma yang diterima secara internasional:

      • AES_128_GCM

      • AES_128_CBC

      • AES_128_ECB

    • Algoritma SM:

      • SM4_128_GCM

      • SM4_128_CBC (Ini adalah nilai default.)

      • SM4_128_ECB

    Catatan
    • Algoritma enkripsi CTR tidak didukung.

    • Algoritma enkripsi AES_128_ECB dan SM4_128_ECB tidak dapat memberikan keamanan tinggi. Kami merekomendasikan Anda memilih algoritma enkripsi lain yang memberikan keamanan lebih tinggi daripada algoritma enkripsi AES_128_ECB dan SM4_128_ECB.

    EncScheme

    RND

    Metode enkripsi. Nilai valid:

    • RND: enkripsi probabilistik. Ini adalah nilai default.

    • DET: enkripsi deterministik.

    Catatan

    Parameter ini tidak valid jika Anda mengatur parameter EncAlgo ke AES_128_ECB atau SM4_128_ECB.

    DekGenMode

    ENCLAVE

    Metode yang digunakan untuk menghasilkan DEK. Nilai valid:

    • ENCLAVE: Server basis data menghasilkan DEK di enclave tepercaya. Ini adalah nilai default.

    • LOCAL: Klien menghasilkan DEK.

    SdkMode

    Default

    Mode SDK. Nilai valid:

    • Default: Semua tipe data teks terenkripsi yang disediakan oleh Edisi Dasar dan Edisi Ditingkatkan Perangkat Keras didukung. Ini adalah nilai default.

    Stateless

    true

    Atribut Stateless yang diterapkan pada basis data selalu rahasia. Nilai valid:

    • true: MEK yang dihasilkan tetap valid setelah klien terputus dari instance RDS. Ini adalah nilai default.

    • false: MEK yang dihasilkan menjadi tidak valid setelah klien terputus dari instance RDS.

    Catatan

    mek dan parameter lainnya dikonfigurasi di sisi klien dan ditransmisikan ke sisi server menggunakan enkripsi amplop. Proses ini memastikan kerahasiaan nilai mek.

  • 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:

com.alibaba.encdb.crypto.EncdbSDKBuilder

Modul ini adalah kelas konstruksi dari EncDB SDK. Modul ini menyediakan operasi API berikut:

// Dapatkan instance EncdbSDKBuilder baru. Anda harus menggunakan metode ini untuk membangun EncdbSDKBuilder. 
EncdbSDKBuilder newInstance();
// Wajib. Konfigurasikan koneksi basis data untuk manajemen kunci terkait libencdb. Koneksi basis data yang dikonfigurasi berbeda dari koneksi basis data yang digunakan dalam skenario bisnis aktual. 
EncdbSDKBuilder setDbConnection(java.sql.Connection dbConnection);
// Wajib. Tentukan jenis klien yang terhubung ke libencdb. Jika Anda menggunakan basis data MySQL selalu rahasia, Anda harus menentukan MYSQL_PROXY.
EncdbSDKBuilder setKeyMgmtType(KeyMgmtType kmType);
// Wajib. Tentukan MEK. MEK harus berupa objek byte[] sepanjang 16 byte atau string heksadesimal dengan panjang 32 karakter.
EncdbSDKBuilder setMek(byte[] mek);
EncdbSDKBuilder setMek(String mekStr);
// Opsional. Konfigurasikan algoritma enkripsi. Nilai valid: AES_128_GCM, AES_128_CBC, AES_128_ECB, SM4_128_CBC, SM4_128_ECB, dan SM4_128_GCM. Jika Anda tidak mengonfigurasi algoritma enkripsi, SM4_128_CBC digunakan secara default. 
EncdbSDKBuilder setEncAlgo(EncAlgo encAlgo);
// Setelah konfigurasi sebelumnya selesai, bangun objek EncdbSDK.
EncdbSDK build();

com.alibaba.encdb.EncdbSDK

Modul ini menyediakan kemampuan manajemen kunci tepercaya dan komunikasi aman end-to-end. Modul ini juga menyediakan operasi API berikut:

// Dapatkan objek Cryptor untuk melakukan operasi pada data teks terenkripsi dan teks biasa. 
Cryptor getCryptor();

com.alibaba.encdb.Cryptor

Modul ini menyediakan kemampuan komputasi kriptografi. Modul ini juga menyediakan operasi API berikut:

/**
 * @brief Antarmuka Enkripsi
 *
 * @param schemaName nama skema, digunakan bersama dengan nama tabel dan nama kolom untuk mencari kunci enkripsi data pengguna dari koneksi basis data yang diberikan.
 *
 * @param tblName    nama tabel, digunakan bersama dengan nama kolom untuk mencari kunci enkripsi data pengguna dari koneksi basis data yang diberikan.
 *
 * @param colName    nama kolom, digunakan bersama dengan nama tabel. Untuk menggunakan kunci enkripsi data default pengguna, atur tblName = "default", colName="default"
 *
 * @param type       tipe encdb yang valid
 * @param val        nilai
 * @return           byte terenkripsi
 */
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, byte[] val);
byte[] encrypt(String schemaName, String tblName, String colName, byte[] val);
byte[] encrypt(String tblName, String colName, EncType type, byte[] val);
byte[] encrypt(String tblName, String colName, byte[] val);
// untuk int
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, int val);
byte[] encrypt(String schemaName, String tblName, String colName, int val);
byte[] encrypt(String tblName, String colName, EncType type, int val);
byte[] encrypt(String tblName, String colName, int val);
// untuk long
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, long val);
byte[] encrypt(String schemaName, String tblName, String colName, long val);
byte[] encrypt(String tblName, String colName, EncType type, long val);
byte[] encrypt(String tblName, String colName, long val);
// untuk float
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, float val);
byte[] encrypt(String schemaName, String tblName, String colName, float val);
byte[] encrypt(String tblName, String colName, EncType type, float val);
byte[] encrypt(String tblName, String colName, float val);
// untuk double
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, double val);
byte[] encrypt(String schemaName, String tblName, String colName, double val);
byte[] encrypt(String tblName, String colName, EncType type, double val);
byte[] encrypt(String tblName, String colName, double val);
// untuk String
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, String val);
byte[] encrypt(String schemaName, String tblName, String colName, String val);
byte[] encrypt(String tblName, String colName, EncType type, String val);
byte[] encrypt(String tblName, String colName, String val);
// untuk BigDecimal
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, BigDecimal val);
byte[] encrypt(String schemaName, String tblName, String colName, BigDecimal val);
byte[] encrypt(String tblName, String colName, EncType type, BigDecimal val);
byte[] encrypt(String tblName, String colName, BigDecimal val);
// untuk Timestamp
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, Timestamp val);
byte[] encrypt(String schemaName, String tblName, String colName, Timestamp val);
byte[] encrypt(String tblName, String colName, EncType type, Timestamp val);
byte[] encrypt(String tblName, String colName, Timestamp val);


/**
 * @brief Antarmuka Dekripsi
 *
 * @param schemaName nama skema, digunakan bersama dengan nama tabel dan nama kolom untuk mencari kunci enkripsi data pengguna dari koneksi basis data yang diberikan.
 *
 * @param tblName    nama tabel, digunakan bersama dengan nama kolom untuk mencari kunci enkripsi data pengguna.
 *
 * @param colName    nama kolom, digunakan bersama dengan nama tabel. Untuk menggunakan kunci enkripsi data default pengguna,
 *                atur tblName = "default", colName="default"
 *
 * @param val        val bisa dalam format biner heksadesimal atau byte pg bytea, misalnya, \\x00621c14
 * @return           nilai terdekripsi dalam format biner heksadesimal atau format tipe tertentu
 */
byte[] decrypt(String schemaName, String tblName, String colName, byte[] val);
byte[] decrypt(String tblName, String colName, byte[] val);
byte[] decrypt(byte[] val);
// Antarmuka dekripsi untuk `int`
int decryptInt(byte[] val);
// Antarmuka dekripsi untuk `long`
long decryptLong(byte[] val);
// Antarmuka dekripsi untuk `float`
float decryptFloat(byte[] val);
// Antarmuka dekripsi untuk `double`
double decryptDouble(byte[] val);
// Antarmuka dekripsi untuk `String`
String decryptString(byte[] val);
// Antarmuka dekripsi untuk `BigDecimal`
BigDecimal decryptDecimal(byte[] val);
// Antarmuka dekripsi untuk `TimeStamp`
Timestamp decryptTimestamp(byte[] val);

psql

Anda dapat menggunakan psql untuk menanyakan data dalam basis data selalu rahasia. Misalnya, jalankan pernyataan SELECT * FROM example; menggunakan psql.

image.png

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.

image.png

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 0xf7070000 muncul 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 @0x5c0369c4 muncul 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-UNNAMED saat menjalankan program untuk mengekspor com.sun.crypto.provider ke modul Unnamed.