Java uygulamanızdan sütun şifreleme ile korunan sütunlardaki verilere erişmek için veritabanınıza bağlanmak üzere EncJDBC sürücüsünü kullanın. EncJDBC, minimum yapılandırma ile şifreli sütunlardan düz metni alır.
Ana şifreleme anahtarını sağladığınızda tüm veri iletim bağlantısı şifrelenir. EncJDBC istemcisi verilerin şifresini otomatik olarak çözer ve uygulamanızın minimal kod değişikliğiyle görüntüleyebileceği düz metni döndürür.
Ön Koşullar
Şifreleme gerektiren sütunları bulmak için bir hassas veri algılama taraması çalıştırdınız.
Hedef veritabanı için sütun şifrelemeyi yapılandırdınız ve veritabanı hesabının iznini Ciphertext Permission (JDBC Decryption) olarak ayarladınız. Ayrıntılı talimatlar için bkz. sütun şifreleme.
Örnek için bağlantı ayrıntıları: ana bilgisayar adı, bağlantı noktası, veritabanı adı, kullanıcı adı ve parola.
MEK Oluşturma
Değer aralığı: Tam olarak 32 karakter uzunluğunda, 16 baytlık onaltılık bir dize.
Sütun şifrelemeyi yapılandırırken seçtiğiniz key type değerine bağlı olarak veritabanının şifresini çözmek için MEK olarak KMS Key veya local key kullanabilirsiniz.
KMS key
KMS key kullanırken KMS hizmetinin kullanılabilir olduğundan emin olun. Aksi takdirde sürekli gizli kalan istemci sürücüsü EncJDBC çalışamaz.
Veritabanı sütun şifreleme yapılandırmanızda seçilen KMS key öğesine sahip KMS örneğinin uç noktasını ve bu KMS anahtarını istemciden okumak için Alibaba Cloud hesabınızın veya RAM kullanıcınızın (KMS şifre çözme iznine sahip olması gerekir) AccessKey ID ve AccessKey secret değerlerini alın. Aşağıdaki adımları izleyin:
Bir Alibaba Cloud hesabı veya bir RAM user kullanarak konsola giriş yapın.
-
-
-
Local key
Veritabanı sütun şifreleme yapılandırmanızda Encryption Method değeri Local Key olarak ayarlandığında bir MEK oluşturun. Örnek: 00112233445566778899aabbccddeeff.
Yaygın oluşturma yöntemleri arasında parola oluşturucular veya programlama dillerindeki rastgele işlevler bulunur.
Örnek:
Linux'ta dahili OpenSSL aracını kullanarak
openssl rand -hex 16komutunu çalıştırarak bir anahtar oluşturun.Windows'ta OpenSSL software package yükleyin.
İstemci entegrasyon talimatları
Java için JDK 1.8 veya sonraki bir sürümü kullanın.
İstemci tarafında veritabanı bağlantı sürücüsünü EncJDBC olarak değiştirin, veritabanı bağlantı URL'sini güncelleyin ve şifreli veritabanı sütunlarından düz metne erişmek için MEK belirtin.
1. Bağımlılıkları yükleme
Aşağıdaki bağımlılığı Maven proje yapılandırma dosyanıza pom.xml ekleyin.
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-cls-jdbc</artifactId>
<version>1.0.10-6</version>
</dependency>
2. Veritabanına bağlanmak için MEK yapılandırma
Aşağıdaki yöntemler MEK nasıl yapılandırılacağını açıklar: JDBC özellikleri yapılandırması, dosya yapılandırması ve URL yapılandırması. Birden fazla yöntemi aynı anda yapılandırırsanız öncelik sırası şu şekildedir: JDBC özellikleri yapılandırması > dosya yapılandırması > URL yapılandırması.
URL yapılandırmasında birden fazla parametreyi
&ile ayırın.Aşağıdaki tüm yapılandırmalarda ve bağlantı yöntemlerinde
MEKistemcide yerel olarak işlenir veMEKsızıntısını önlemek için zarf şifreleme kullanılarak sunucuya güvenli bir şekilde gönderilir.
Veritabanı sütun şifreleme yapılandırmanızdaki Encryption method değerine bağlı olarak veritabanına local key veya KMS key kullanarak bağlanmayı seçin.
Connect to the database using a KMS key
KMS tarafından yönetilen bir MEK almak için STS geçici kimlik bilgilerini kullanıyorsanız geçici kimlik bilgisi STS belirtecini almak için STS SDK'yı kullanın. STS SDK örnekleri için bkz. STS SDK'ya genel bakış.
Erişim kimlik bilgilerini (AccessKey ID ve AccessKey secret) doğrudan uygulama kodunuza sabit kodlamayın. Bu örnekte erişim kimlik bilgilerini yönetmek için sistem ortam değişkenleri kullanılır. Ayrıntılar için bkz. Linux, macOS ve Windows'ta ortam değişkenlerini yapılandırma.
JDBC özellikleri yapılandırması
Standart JDBC bağlantı sırasında Properties kullanarak özel özellikler ayarlamanıza olanak tanır. Aşağıdaki örnek JDBC özelliklerinin nasıl yapılandırılacağını ve JDBC'nin nasıl çalıştırılacağını gösterir:
// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Retrieve access credentials (AccessKey ID and AccessKey secret) from environment variables.
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// If using STS temporary credentials to read the KMS key, also provide the obtained STS token.
// String stsToken = "yourSecurityToken";
// KMS instance endpoint. Use the public endpoint if public network access is enabled. Use the VPC endpoint for VPC access.
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");
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Load the EncJDBC driver for MySQL.
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Execute queries ...
URL yapılandırması
Aşağıda gösterildiği gibi KMS anahtarını almak için gereken parametreleri doğrudan URL'ye gömebilirsiniz:
// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Retrieve access credentials (AccessKey ID and AccessKey secret) from environment variables.
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// If using STS temporary credentials to read the KMS key, also provide the obtained STS token.
// String stsToken = "yourSecurityToken";
// KMS instance endpoint. Use the public endpoint if public network access is enabled. Use the VPC endpoint for VPC access.
String kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";
// Connection URL format for 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);
// With STS token.
// 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);
// Load the EncJDBC driver for MySQL.
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Execute queries ...
Connect to the database using a local key
JDBC özellikleri yapılandırması
Standart JDBC bağlantı sırasında Properties kullanarak özel özellikler ayarlamanıza olanak tanır. Aşağıdaki örnek JDBC özelliklerinin nasıl yapılandırılacağını ve JDBC'nin nasıl çalıştırılacağını gösterir:
// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Master encryption key.
String mek = "00112233445566778899aabbccddeeff";
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("MEK", mek);
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s". For PostgreSQL, use "jdbc:postgresql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Load the EncJDBC driver for MySQL. For PostgreSQL, use "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, props);
// ... Execute queries ...
Dosya yapılandırması
Gerekli MEK gibi parametreleri bir yapılandırma dosyası aracılığıyla içe aktarabilirsiniz.
Dosya yapılandırması yalnızca local key MEK'ler için geçerlidir.
Projenizde property adlı bir encJdbcConfigFile ayarlayabilir ve değerini yapılandırma dosyası yoluna (varsayılan olarak encjdbc.conf dosyası kullanılır) ayarlayabilirsiniz. Yapılandırma dosyasının içeriği aşağıdaki gibidir:
MEK=00112233445566778899aabbccddeeff
Yapılandırma dosyasını iki konumdan birine yerleştirebilirsiniz:
-
Dosyayı projenizin resources dizinine aşağıda gösterildiği gibi koyun:
src main java resources encjdbc.conf Dosyayı proje kök dizinine (programın çalışma zamanı dizini) koyun.
Dosya yapılandırmasını ayarladıktan sonra kodunuzda aşağıda gösterildiği gibi ek bir yapılandırmaya gerek yoktur:
// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s". For PostgreSQL, use "jdbc:postgresql:encdb://%s:%s/%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s", hostname, port, dbname);
// Load the EncJDBC driver for MySQL. For PostgreSQL, use "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Execute queries ...
URL yapılandırması
Aşağıda gösterildiği gibi MEK gibi parametreleri doğrudan URL'ye gömebilirsiniz:
// Prepare connection information such as hostname, port, database name, username, and password.
// ...
String hostname = "your-hostname";
String port = "your-port";
String dbname = "your-database-name";
String username = "your-username";
String password = "your-password";
// Master encryption key.
String mek = "00112233445566778899aabbccddeeff";
// Connection URL format for MySQL: "jdbc:mysql:encdb://%s:%s/%s?MEK=%s". For PostgreSQL, use "jdbc:postgresql:encdb://%s:%s/%s?MEK=%s".
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s", hostname, port, dbname, mek);
// Load the EncJDBC driver for MySQL. For PostgreSQL, use "com.aliyun.encdb.postgresql.jdbc.EncDriver".
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// Get the database connection.
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// ... Execute queries ...
3. Şifreli sütunlardan düz metin verilerini sorgulama
Veritabanına başarıyla bağlandıktan sonra standart bir JDBC sorgusu gibi çalıştırın. EncJDBC şifreli sütunların şifresini otomatik olarak çözer ve düz metin verilerini döndürür.
Örnek kod:
// Execute the query.
// Create a query statement.
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name");
// Traverse the result set.
while (resultSet.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");
}
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 daha yeni JDK sürümlerinin modüller arası erişimi kısıtlamasından kaynaklanabilir. 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.provideröğesini adsız 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ındır. Çözmek için aşağıdaki yöntemlerden birini kullanın:
Amazon Corretto JDK kullanın.
-
Oracle JDK'nız için bir güvenlik sağlayıcısını aşağıdaki adımları izleyerek 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