全部产品
Search
文档中心

Data Security Center:Integrasikan EncJDBC

更新时间:Nov 11, 2025

Setelah mengenkripsi kolom data sensitif dalam tabel database ApsaraDB RDS for MySQL, ApsaraDB RDS for PostgreSQL, PolarDB for MySQL, atau PolarDB for PostgreSQL, Anda dapat menggunakan driver EncJDBC untuk menghubungkan aplikasi Java ke database tersebut dan mengakses data teks biasa pada kolom yang telah dienkripsi. Topik ini menjelaskan cara menggunakan EncJDBC untuk menghubungkan ke database dan mengakses data teks biasa dari kolom terenkripsi.

Prasyarat

  • Enkripsi kolom telah dikonfigurasi untuk database target, dan akun database target telah diberikan izin Ciphertext Permission (JDBC Decryption). Untuk informasi lebih lanjut tentang cara mengonfigurasi enkripsi kolom untuk database dan penjelasan rinci mengenai izin akun, lihat Konfigurasi enkripsi kolom untuk database.

  • Anda telah memperoleh informasi koneksi untuk database terenkripsi, termasuk titik akhir, port, nama database, akun database, dan kata sandi.

Informasi latar belakang

Fitur enkripsi kolom memungkinkan Anda mengenkripsi kolom tertentu dalam database guna meningkatkan keamanan data. Data terenkripsi disimpan sebagai ciphertext di database. Namun, klien yang berwenang dapat mendekripsi ciphertext secara transparan dan mengakses data teks biasa.

Alibaba Cloud menyediakan driver klien always-encrypted EncJDBC untuk bahasa pemrograman Java. Anda dapat menggunakan driver ini di sisi klien untuk menghubungkan ke database dan menentukan Master Encryption Key (MEK) dalam URL koneksi database guna mengakses database terenkripsi. Driver ini secara otomatis mendekripsi ciphertext dan mengembalikan data teks biasa.

Buat MEK

Klien mengirimkan MEK ke server database melalui protokol enkripsi kunci asimetris yang aman. Proses ini memastikan bahwa server dan klien berbagi kunci yang sama, sehingga memungkinkan transmisi data yang aman menggunakan enkripsi simetris.

Rentang nilai: string heksadesimal sepanjang 16 byte, yaitu 32 karakter.

Peringatan

MEK adalah kredensial utama yang memberi otorisasi kepada klien untuk mengakses data terenkripsi. Untuk alasan keamanan, database terenkripsi tidak menyimpan atau mengelola MEK Anda. Database tersebut juga tidak menyediakan layanan untuk membuat atau mencadangkan MEK. Anda harus membuat MEK sendiri. Penyimpanan dan pengelolaan MEK sangat penting bagi keamanan database. Kami menyarankan agar Anda mencadangkan MEK secara aman.

Bergantung pada Encryption Method yang dipilih dalam konfigurasi enkripsi kolom, Anda dapat memperoleh KMS Key atau membuat Local Key untuk digunakan sebagai MEK dalam mendekripsi database.

Kunci KMS

Penting

Saat menggunakan kunci KMS, pastikan Key Management Service (KMS) tersedia. Jika tidak, driver klien always-encrypted EncJDBC tidak akan berfungsi.

Anda perlu memperoleh titik akhir instans KMS yang berisi kunci KMS yang dipilih dari konfigurasi enkripsi kolom. Anda juga memerlukan ID AccessKey dan Rahasia AccessKey dari Akun Alibaba Cloud atau Pengguna Resource Access Management (RAM) yang sesuai. Akun atau pengguna tersebut harus memiliki izin dekripsi KMS agar klien dapat membaca kunci KMS. Lakukan langkah-langkah berikut:

  1. Masuk ke konsol menggunakan Akun Alibaba Cloud atau Pengguna RAM.

  2. Jika Anda adalah Pengguna RAM, berikan izin dekripsi KMS kepada Pengguna RAM tersebut.

    1. Buat kebijakan izin kustom. Konten kebijakan adalah sebagai berikut:

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "KMS:Decrypt",
                  "Resource": "*"
              }
          ]
      }
    2. Berikan kebijakan izin kustom tersebut kepada Pengguna RAM yang ditentukan. Untuk informasi selengkapnya, lihat Berikan izin kepada Pengguna RAM.

  3. Peroleh titik akhir instans KMS.

    • Secara default, kunci dalam instans KMS hanya dapat diakses dari jaringan VPC. Di halaman manajemen instans KMS, temukan instans KMS target, klik Details di kolom Actions, lalu lihat titik akhir VPC instans pada tab Basic Information.

    • Untuk mengakses kunci melalui Internet, aktifkan akses jaringan publik lalu lihat Public Endpoint. Untuk informasi selengkapnya, lihat Aktifkan akses jaringan publik.

  4. Peroleh pasangan AccessKey.

    Saat membuat pasangan AccessKey untuk Akun Alibaba Cloud atau Pengguna RAM, simpan ID AccessKey dan Rahasia AccessKey. Untuk informasi selengkapnya, lihat Buat pasangan AccessKey.

Kunci lokal

Saat Encryption Method dalam konfigurasi enkripsi kolom diatur ke Local Key, Anda perlu membuat MEK. Contohnya: 00112233445566778899aabbccddeeff.

Metode pembuatan umum mencakup penggunaan alat pembuat kata sandi atau fungsi acak dalam bahasa pemrograman.

Contohnya:

  • Pada Linux, Anda dapat menggunakan alat OpenSSL bawaan dan menjalankan perintah openssl rand -hex 16 untuk membuat kunci.

  • Pada Windows, Anda dapat menginstal paket perangkat lunak OpenSSL.

Petunjuk akses klien

Penting

Gunakan Java Development Kit (JDK) 1.8 atau versi yang lebih baru.

Di sisi klien, Anda dapat mengganti driver koneksi database menjadi EncJDBC, memperbarui URL koneksi database, dan menentukan MEK untuk mengakses data teks biasa pada kolom terenkripsi.

1. Instal dependensi

Tambahkan dependensi berikut ke file pom.xml proyek Maven Anda.

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-cls-jdbc</artifactId>
    <version>1.0.10-1</version>
</dependency>

2. Konfigurasi MEK untuk menghubungkan ke database

Anda dapat menggunakan metode berikut untuk mengonfigurasi MEK: konfigurasi properti JDBC, konfigurasi file, dan konfigurasi URL. Jika Anda mengonfigurasi Konektivitas Basis Data Java (JDBC) menggunakan lebih dari satu metode, prioritas berikut berlaku: konfigurasi properti JDBC > konfigurasi file > konfigurasi URL.

Catatan
  • Dalam metode konfigurasi URL, Anda dapat menggabungkan beberapa parameter dengan tanda ampersand (&).

  • Dengan metode konfigurasi dan koneksi berikut, MEK diproses secara lokal di sisi klien dan dikirim ke server secara aman menggunakan enkripsi amplop. Hal ini memastikan bahwa MEK tidak bocor.

Berdasarkan Metode Enkripsi dalam konfigurasi enkripsi kolom, hubungkan ke database menggunakan kunci lokal atau kunci KMS.

Hubungkan ke database menggunakan kunci KMS

Penting
  • Jika Anda menggunakan kredensial akses sementara dari Layanan Token Keamanan (STS) untuk memperoleh MEK yang dikelola KMS, Anda dapat menggunakan kit pengembangan perangkat lunak (SDK) STS untuk memperoleh token STS sementara. Untuk contoh SDK STS, lihat Ikhtisar SDK STS.

  • Jangan menyematkan pasangan AccessKey (ID AccessKey dan Rahasia AccessKey) secara langsung dalam kode bisnis Anda. Contoh ini menggunakan variabel lingkungan sistem untuk mengelola pasangan AccessKey. Untuk informasi selengkapnya, lihat Konfigurasi variabel lingkungan pada Linux, macOS, dan Windows.

Konfigurasi properti JDBC

Saat menghubungkan menggunakan JDBC standar, Anda dapat mengatur properti pengguna kustom melalui Properties. Contoh berikut menunjukkan cara mengonfigurasi dan menjalankan JDBC dengan cara ini:

// Siapkan informasi koneksi, seperti titik akhir (hostname), port, nama instansiasi basis data (dbname), nama pengguna, dan kata sandi.
// ...

String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";

// Dapatkan ID AccessKey dan Rahasia AccessKey dari variabel lingkungan sistem.
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// Jika Anda menggunakan kredensial akses sementara STS untuk membaca kunci KMS, Anda juga perlu menyediakan token Layanan Token Keamanan (STS) yang diperoleh.
// String stsToken= "yourSecurityToken";

// Titik akhir instans KMS. Gunakan titik akhir publik untuk akses Internet. Gunakan titik akhir VPC instans untuk akses VPC.
String kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";

Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_ID", accessKeyId);
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET", accessKeySecret);
props.setProperty("ALIBABA_CLOUD_KMS_ENDPOINT", kmsEndpoint);
// props.setProperty("ALIBABA_CLOUD_STS_TOKEN","stsToken");



// Berikut adalah format URL koneksi untuk database RDS untuk MySQL: "jdbc:mysql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);

// Berikut memuat driver EncJDBC untuk database RDS untuk MySQL.
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

// Dapatkan koneksi database.
Connection connection = DriverManager.getConnection(dbUrl, props);

// ... Mulai kueri ...
Konfigurasi URL

Anda dapat menyematkan parameter untuk memperoleh kunci KMS dalam URL, seperti yang ditunjukkan pada contoh berikut:

// Siapkan informasi koneksi, seperti titik akhir (hostname), port, nama instansiasi basis data (dbname), nama pengguna, dan kata sandi.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";

// Dapatkan ID AccessKey dan Rahasia AccessKey dari variabel lingkungan sistem.
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// Jika Anda menggunakan kredensial akses sementara STS untuk membaca kunci KMS, Anda juga perlu menyediakan token STS yang diperoleh.
// String stsToken= "yourSecurityToken";

// Titik akhir instans KMS. Gunakan titik akhir publik untuk akses Internet. Gunakan titik akhir VPC instans untuk akses VPC.
String kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";

// Berikut adalah format URL koneksi untuk database RDS untuk MySQL.
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?ALIBABA_CLOUD_ACCESS_KEY_ID=%s&ALIBABA_CLOUD_ACCESS_KEY_SECRET=%s&ALIBABA_CLOUD_KMS_ENDPOINT=%s", hostname, port, dbname, accessKeyId,accessKeySecret,kmsEndpoint);
// Gunakan token STS.
// String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?ALIBABA_CLOUD_ACCESS_KEY_ID=%s&ALIBABA_CLOUD_ACCESS_KEY_SECRET=%s&ALIBABA_CLOUD_KMS_ENDPOINT=%s&ALIBABA_CLOUD_STS_TOKEN=%s", hostname, port, dbname, accessKeyId,accessKeySecret,kmsEndpoint,stsToken);

// Berikut memuat driver EncJDBC untuk database RDS untuk MySQL.
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

// Dapatkan koneksi database.
Connection connection = DriverManager.getConnection(dbUrl, username, password);

// ... Mulai kueri ...

Hubungkan ke database menggunakan kunci lokal

Konfigurasi properti JDBC

Saat menghubungkan menggunakan JDBC standar, Anda dapat mengatur properti pengguna kustom melalui Properties. Contoh berikut menunjukkan cara mengonfigurasi dan menjalankan JDBC dengan cara ini:

// Siapkan informasi koneksi, seperti titik akhir (hostname), port, nama instansiasi basis data (dbname), nama pengguna, dan kata sandi.
// ...

String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Kunci master pelanggan.
String mek = "00112233445566778899aabbccddeeff"; 

Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);

// Berikut adalah format URL koneksi untuk database RDS untuk MySQL: "jdbc:mysql:encdb://%s:%s/%s". Untuk database RDS untuk PostgreSQL, ganti formatnya menjadi "jdbc:postgresql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);

// Berikut memuat driver EncJDBC untuk database RDS untuk MySQL. Untuk database RDS untuk PostgreSQL, ganti drivernya menjadi "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

// Dapatkan koneksi database.
Connection connection = DriverManager.getConnection(dbUrl, props);

// ... Mulai kueri ...
Konfigurasi file

Anda dapat mengimpor parameter, seperti MEK yang diperlukan, dari file konfigurasi.

Catatan

Metode konfigurasi file hanya berlaku untuk mengonfigurasi MEK kunci lokal.

Dalam proyek Anda, Anda dapat mengatur properti bernama encJdbcConfigFile dan atur nilainya ke jalur file konfigurasi. Jika Anda tidak mengatur properti ini, file encjdbc.conf akan digunakan secara default. Isi file konfigurasi adalah sebagai berikut:

MEK=00112233445566778899aabbccddeeff

Anda dapat menempatkan file konfigurasi di salah satu dari dua lokasi berikut:

  • Tempatkan file di folder resources proyek Anda, seperti yang ditunjukkan pada gambar berikut:

    image

  • Tempatkan file di direktori root proyek, yaitu direktori waktu proses program.

Setelah Anda mengonfigurasi file tersebut, Anda tidak perlu melakukan konfigurasi tambahan dalam program Anda, seperti yang ditunjukkan pada contoh berikut:

// Siapkan informasi koneksi, seperti titik akhir (hostname), port, nama instansiasi basis data (dbname), nama pengguna, dan kata sandi.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";

// Berikut adalah format URL koneksi untuk database RDS untuk MySQL: "jdbc:mysql:encdb://%s:%s/%s". Untuk database RDS untuk PostgreSQL, ganti formatnya menjadi "jdbc:postgresql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);

// Berikut memuat driver EncJDBC untuk database RDS untuk MySQL. Untuk database RDS untuk PostgreSQL, ganti drivernya menjadi "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

// Dapatkan koneksi database.
Connection connection = DriverManager.getConnection(dbUrl, username, password);

// ... Mulai kueri ...
Konfigurasi URL

Anda dapat menyematkan parameter, seperti MEK, dalam URL, seperti yang ditunjukkan pada contoh berikut:

// Siapkan informasi koneksi, seperti titik akhir (hostname), port, nama instansiasi basis data (dbname), nama pengguna, dan kata sandi.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
 // Kunci master pelanggan.
String mek = "00112233445566778899aabbccddeeff";

// Berikut adalah format URL koneksi untuk database RDS untuk MySQL: "jdbc:mysql:encdb://%s:%s/%s?MEK=%s". Untuk database RDS untuk PostgreSQL, ganti formatnya menjadi "jdbc:postgresql:encdb://%s:%s/%s?MEK=%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s", hostname, port, dbname, mek);

// Berikut memuat driver EncJDBC untuk database RDS untuk MySQL. Untuk database RDS untuk PostgreSQL, ganti drivernya menjadi "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

// Dapatkan koneksi database.
Connection connection = DriverManager.getConnection(dbUrl, username, password);

// ... Mulai kueri ...

3. Kueri data teks biasa dari kolom terenkripsi

Setelah berhasil menghubungkan ke database, Anda dapat melakukan operasi database seperti halnya kueri JDBC biasa. EncJDBC secara otomatis mendekripsi kolom terenkripsi dan mengembalikan data teks biasa.

Kode contoh:

// Mulai kueri.

// Buat pernyataan kueri.
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name");

// Telusuri set hasil.
while (resultSet.next()) {
    for (int i = 0; i < resultSet.getMetaData().getColumnCount(); i++) {
        System.out.print(resultSet.getString(i + 1));
        System.out.print("\t");
    }
    System.out.print("\n");
}

Contoh kode lengkap

Bagian ini memberikan contoh penggunaan konfigurasi properti JDBC untuk mengatur MEK kunci lokal. Contoh ini menunjukkan cara menggunakan akun database dengan izin Ciphertext Permission (JDBC Decryption) untuk mengkueri data teks biasa pada kolom terenkripsi dalam database RDS for MySQL.

Untuk informasi mengenai konfigurasi database dalam contoh berikut, lihat Contoh enkripsi kolom database RDS MySQL dalam Verifikasi hasil enkripsi kolom.

Catatan

Contoh ini menggunakan Maven 3.9.9 dan alat pengembangan IntelliJ IDEA Community Edition 2024.1.2.

import java.sql.*;
import java.util.Properties;
public class EncryptedColumnAccess {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // Ganti informasi koneksi berikut, seperti titik akhir (hostname), port, nama instansiasi basis data (dbname), nama pengguna, dan kata sandi, dengan informasi instans Anda.
        String hostname = "rm-******.mysql.rds.aliyuncs.com";
        String port = "3306";
        String dbname = "sddp_em_db";
        String username = "sddp_em03";
        String password = "******";
        
        // Ini hanya contoh. Kami menyarankan agar Anda menggunakan kunci yang lebih kompleks.
        String mek="00112233445566778899aabbccddeeff";

        Properties props = new Properties();
        props.setProperty("user", username);
        props.setProperty("password", password);
        props.setProperty("MEK", mek);

        String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);

        // Muat driver EncJDBC.
        Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");

        // Dapatkan koneksi database.
        Connection connection = DriverManager.getConnection(dbUrl, props);


        // Mulai kueri.
        try {
            // Buat pernyataan kueri.
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");

            // Telusuri set hasil.
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("username");
                String phone = resultSet.getString("phone");

                // Proses bidang lain berdasarkan skema tabel Anda.
                System.out.println("ID: " + id + ", Nama: " + name + ", Telepon: " + phone);
            }

            // Tutup sumber daya.
            resultSet.close();
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Contoh keluaran:

image