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
Şifreli veritabanı özelliğini etkinleştirdiniz. Daha fazla bilgi için bkz. Şifreli veritabanı özelliğini etkinleştirme.
Ana makine adı, bağlantı noktası, veritabanı adı, kullanıcı adı ve parola gibi veritabanı bağlantı bilgilerini edindiniz.
Bir veri koruma kuralı yapılandırdınız. Daha fazla bilgi için bkz. SQL kullanarak sütun şifreleme kurallarını yapılandırma.
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.
NotBu konudaki örnekler Maven
3.9.2veIntelliJ IDEA Community Edition 2022.3.2kullanı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ı.
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:
Not
|
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ı.
URL yapılandırma yöntemini kullanırken birden çok parametreyi
&karakteriyle birleştirebilirsiniz.Üç bağlantı yönteminin tümünde
MEKistemcide yerel olarak işlenir. İstemci, sunucuya gönderilen veri anahtarlarını korumak için zarf şifrelemeyi kullanır. Bu sayedeMEKhiç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.confdosyasını projenizinsrc/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 @0x5c0369c4hatası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-UNNAMEDVM seçeneğini ekleyin. Bu seçenekcom.sun.crypto.providerpaketini 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 errorhatası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:
JDK kurulum dizininizi bulun.
<jdk_installation_path>/conf/security/dizinindejava.securitydosyasını bulun.-
java.securitydosyası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