Tüm Ürünler
Search
Belge Merkezi

ApsaraDB RDS:EncJDBC

Son Güncelleme:Oct 12, 2026

Korunan sütunlardaki verileri şifrelemek ve bir Java uygulamasından veritabanına erişmek için şifreli veritabanı özelliğiyle birlikte EncJDBC istemci sürücüsünü kullanın. EncJDBC, şifreli veritabanına bağlanmak için uygun maliyetli ve pratik bir yol sunar. Bu konuda, şifreli veritabanına EncJDBC kullanarak nasıl erişileceği açıklanmaktadır.

Ana şifreleme anahtarı (MEK) yapılandırıldığında EncJDBC, şifreli metni otomatik olarak çözer ve açık metni döndürür. Bu süreç uygulamanız için şeffaftır. Yalnızca birkaç satırlık yapılandırma ile şifreli veritabanına bağlanabilir ve şifreli veritabanı özelliğini kullanmanın maliyetini düşürebilirsiniz.

Önkoşullar

Kullanım notları

  • Ana şifreleme anahtarınızı (MEK) güvenli bir şekilde saklayın.

  • JDK 1.8 veya sonraki bir sürümü kullanın.

    Not

    Bu konudaki örnekler Maven 3.9.2 ve IntelliJ IDEA Community Edition 2022.3.2 kullanır.

Yordam

Adım 1: Maven bağımlılığını ekleyin

Maven projenizdeki pom.xml dosyasına aşağıdaki bağımlılıkları eklemeniz gerekir.

<dependencies>
  <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-encdb-mysql-jdbc</artifactId>
    <version>1.0.9-1</version>
  </dependency>
</dependencies>

Adım 2: İstemciyi yapılandırın ve verileri sorgulayın

EncJDBC öğesini diğer JDBC sürücüleri gibi kullanabilirsiniz. Ancak öncelikle MEK (ana şifreleme anahtarı) ve ENC_ALGO (şifreleme algoritması) gibi güvenlik açısından kritik parametreleri yapılandırmanız gerekir.

Aşağıdaki tabloda parametreler ve örnek değerler açıklanmaktadır.

Parametre

Örnek değer

Açıklama

MEK

00112233445566778899aabbccddeeff

Özelleştirip yönettiğiniz bir ana şifreleme anahtarı.

openssl rand -hex 16 gibi bir parola oluşturma aracı kullanarak, bir programlama dilindeki rastgele işleviyle veya üçüncü taraf bir Key Management Service (KMS) hizmetinden alarak MEK oluşturabilirsiniz.

Değer, 32 karakterlik onaltılık bir dize (16 bayt) olmalıdır.

Uyarı

MEK, şifrelenmiş verilere erişmek için kök kimlik bilgisidir. Güvenlik nedeniyle şifreli veritabanı MEK'nizi depolamaz veya yönetmez ve bunun için oluşturma ya da yedekleme hizmeti sunmaz. MEK'nizi oluşturmaktan ve yedeklemekten siz sorumlusunuz. Anahtarı kaybederseniz verilerinize erişiminizi kalıcı olarak kaybedersiniz. MEK'nizi güvenli bir şekilde yedeklemenizi öneririz.

ENC_ALGO

SM4_128_CBC

Korunan veriler için şifreleme algoritması.

Geçerli değerler:

  • Uluslararası kabul görmüş algoritmalar:

    • AES_128_GCM

    • AES_128_CTR

    • AES_128_CBC

    • AES_128_ECB (önerilmez)

  • Çin ulusal standart algoritmaları:

    • SM4_128_GCM (varsayılan)

    • SM4_128_CTR

    • SM4_128_CBC

    • SM4_128_ECB (önerilmez)

Not
  • AES_128_ECB ve SM4_128_ECB şifreleme algoritmaları daha az güvenlidir. Bunları dikkatli kullanın. Bunun yerine daha güvenli diğer şifreleme algoritmalarını kullanmanızı öneririz.

  • Bu parametre isteğe bağlıdır. Varsayılan değer SM4_128_GCM şeklindedir.

MEK ve ENC_ALGO öğelerini yapılandırın

Bu bölümde MEK ve ENC_ALGO öğelerini yapılandırmak için üç yöntem açıklanmaktadır. Birden fazla yapılandırma yöntemi kullanırsanız aşağıdaki öncelik sırası geçerlidir: JDBC özellikleri > Yapılandırma dosyası > URL yapılandırması.

Not
  • URL yapılandırma yöntemini kullanırken birden çok parametreyi & karakteriyle birleştirebilirsiniz.

  • Üç bağlantı yönteminin tümünde MEK istemcide yerel olarak işlenir. İstemci, sunucuya gönderilen veri anahtarlarını korumak için zarf şifrelemeyi kullanır. Bu sayede MEK hiçbir zaman açığa çıkmaz.

JDBC özellikleri

Standart JDBC'de bağlantı sırasında özel nitelikleri bir Properties nesnesi kullanarak ayarlayabilirsiniz. Aşağıdaki örnekte bir bağlantı için JDBC özelliklerinin nasıl yapılandırılacağı gösterilmektedir:

// Prepare the connection details, such as hostname, port, database name, username, and password.
// ...
String mek=...;
String encAlgo=...;
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);
props.setProperty("ENC_ALGO", encAlgo);
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Initiate a query ...

Yapılandırma dosyası

MEK gibi parametreleri bir yapılandırma dosyasından içe aktarabilirsiniz. Projenizde encJdbcConfigFile adlı bir özelliği yapılandırma dosyasının yoluna ayarlayın. Bu özelliği ayarlamazsanız sürücü varsayılan encjdbc.conf dosyasını kullanır.

Yapılandırma dosyası aşağıdaki içeriği içermelidir:

MEK=
ENC_ALGO=

Yapılandırma dosyasını aşağıdaki konumlardan birine yerleştirin:

  • encjdbc.conf dosyasını projenizin src/main/resources/ dizinine yerleştirin.

  • Dosyayı projenizin kök dizinine, yani çalışma zamanındaki çalışma dizinine yerleştirin.

Dosyayı yapılandırdıktan sonra kodunuzda aşağıdaki örnekte gösterildiği gibi ek bir yapılandırma yapmanız gerekmez:

// Prepare the connection details, such as hostname, port, database name, username, and password.
// ...
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Initiate a query ...

URL yapılandırması

MEK ve ENC_ALGO gibi parametreleri aşağıdaki örnekte gösterildiği gibi URL'ye gömebilirsiniz:

// Prepare the connection details, such as hostname, port, database name, username, and password.
// ...
String mek=...;
String encAlgo=...;
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s&ENC_ALGO=%s", hostname, port, dbname, mek, encAlgo);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Initiate a query ...

Kod örneği

// Replace hostname, port, dbname, username, and password with your instance details.
String hostname = "hostname";
String port = "port";
String dbname = "db";
String username = "user";
String password = "password";
String mek="00112233445566778899aabbccddeeff";  // Example only. Use a more complex key.
String encAlgo="SM4_128_CBC";
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);
props.setProperty("ENC_ALGO", encAlgo);
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
Connection connection = DriverManager.getConnection(dbUrl, props);
int[] intData = {1, 2, 3, 4, 5, 6};
String[] strData = {"abc", "bcd", "1", "def", "efg", "fgi"};
// Create a table.
connection.createStatement().executeUpdate("drop table if exists test");
connection.createStatement().executeUpdate("create table test (a int, b text)");
// Insert data.
for (int i = 0; i < 6; i++) {
    PreparedStatement pstmt = connection.prepareStatement("insert into test values (?,?)");
    pstmt.setInt(1, intData[i]);
    pstmt.setString(2, strData[i]);
    pstmt.executeUpdate();
}
// Check the plaintext data.
ResultSet rs = connection.createStatement().executeQuery("select * from test");
while (rs.next()) {
    for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
        System.out.print(rs.getString(i + 1));
        System.out.print("\t");
    }
    System.out.print("\n");
}

Beklenen çıktı:

1	abc	
2	bcd	
3	1	
4	def	
5	efg	
6	fgi	

SSS

  • S: Uygulamayı çalıştırdığımda neden 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 hatasını alıyorum?

    C: Bu hata, yeni JDK sürümlerinin modüller arası erişimi kısıtlaması nedeniyle oluşabilir. Bu sorunu çözmek için çalışma zamanında --add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMED VM seçeneğini ekleyin. Bu seçenek com.sun.crypto.provider paketini isimsiz modüle dışa aktarır ve erişim sorununu çözer.

  • S: Uygulamayı çalıştırdığımda neden failed in mek provision: you might have an incorrect mek setting. Detail:gcmEncrypt error hatasını alıyorum?

    C: Bu sorun Oracle JDK ile yaygın olarak görülür. Çözmek için aşağıdaki yöntemlerden birini kullanın:

    • Amazon Corretto JDK kullanın.

    • Oracle JDK'niz için aşağıdaki adımları izleyerek bir güvenlik sağlayıcısını manuel olarak yapılandırın:

      1. JDK kurulum dizininizi bulun.

      2. <jdk_installation_path>/conf/security/ dizininde java.security dosyasını bulun.

      3. java.security dosyasını düzenleyin. List of providers and their preference orders (see above): bölümüne aşağıdaki satırı ekleyin:

        security.provider.14=org.bouncycastle.jce.provider.BouncyCastleProvider