日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

集成EncJDBC

重要

本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。

全密態數據庫對查詢結果中的目標數據進行加密。為了幫助客戶Java業務系統改造、一鍵式接入全密態數據庫系統,全密態數據庫推出了與之配套的全密態客戶端驅動JDBC(即EncJDBC)。EncJDBC能夠自動完成密文數據的解密并返回明文數據,過程對應用透明,業務應用僅需幾行配置即可接入全密態數據庫,已有業務代碼無需任何修改。本文檔介紹了如何使用EncJDBC訪問數據庫。

前提條件

  • 已開通全密態功能,詳情請參見如何開通全密態PolarMySQL功能

  • 已獲取加密數據庫連接信息。您首先需要獲取加密數據庫的連接信息,如域名(host)、端口(port)、數據庫實例名(dbname)、用戶名(username)、密碼(password)等。

  • 已配置數據保護規則。具體操作請參見管理加密規則

注意事項

  • 請保存好您設置的主密鑰MEK

  • JAVA版本需要在1.8及以上。

說明

本文中使用的Maven版本為3.9.2,使用的開發工具為IntelliJ IDEA Community Edition 2022.3.2

操作步驟

步驟一:添加Maven依賴

您需要在自己的Maven項目的pom.xml配置文件中添加以下依賴項:

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-encdb-mysql-jdbc</artifactId>
    <version>1.0.8</version>
</dependency>
說明

在添加Maven依賴時請根據實際使用場景替換version的值。您可以在官網上查看aliyun-encdb-mysql-jdbc的最新版本。

步驟二:通過全密態客戶端查詢(代碼示例)

您可以像使用任意一個JDBC一樣使用EncJDBC。但是您需要預先在EncJDBC中配置和您數據安全息息相關的MEK(主密鑰)、ENC_ALGO(加密算法)。具體的參數說明及其示例見下表:

參數

說明

取值示例(字符串類型)

MEK

用戶主密鑰,由用戶自定義指定。

常見的生成方法有:密碼生成工具(如openssl, openssl rand -hex 16)、編程語言中的random函數、或者從第三方密鑰管理服務(KMS)獲取。

取值范圍:長度為16字節的16進制字符串,且長度為32個字符。

警告

用戶主密鑰是您訪問加密數據的根憑據,出于安全考慮,全密態數據庫不持有并管理您的主密鑰,也不提供用戶主密鑰的生成和備份服務,您需要自行生成用戶主密鑰。一旦您丟失密鑰,將無法再訪問已有的數據。因此,建議您妥善備份用戶主密鑰。

00112233445566778899aabbccddeeff

ENC_ALGO

被保護數據將要使用的加密算法。取值范圍如下:

  • SM4_128_CBC(默認)

  • SM4_128_ECB(不推薦)

  • SM4_128_GCM

  • SM4_128_CTR

  • AES_128_GCM

  • AES_128_ECB(不推薦)

  • AES_128_CBC

  • AES_128_CTR

SM4_128_CBC

配置MEK和ENC_ALGO

下面介紹三種配置MEKENC_ALGO的方法。如果您的JDBC配置了兩種以上的方法,優先級順序為:JDBC properties配置 > 文件配置 > URL配置。

說明
  • URL配置方式中,多個參數可以用&進行拼接。

  • 以下三種連接方式,MEK均在客戶端本地進行處理,并以安全方式分發(信封加密)到服務端,始終保證MEK不泄露。

JDBC properties配置

標準的JDBC在連接數據庫時,可以通過Properties設置用戶自定義屬性。以下是一個通過這種方式配置JDBC屬性并運行JDBC的示例:

// 準備好域名(hostname)、端口(port)、數據庫實例名(dbname)、用戶名(username)、密碼(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);

// ... 發起查詢 ...

文件配置

PolarDB MySQL版支持通過配置文件來導入參數方式,配置需要的MEK等參數。您可以在項目中設置一個名為encJdbcConfigFile的property,將值設置為配置文件路徑即可(缺省時,默認使用encjdbc.conf的文件)。配置文件的內容如下:

MEK=
ENC_ALGO=

您可以通過以下兩種方式放置配置文件的位置:

  • 將文件放入項目中的resources目錄下,如下圖所示:

    image.png

  • 將文件放入項目根目錄,即程序的運行時目錄。

通過文件配置方式,在配置完成后,您可以不用在程序中做額外的配置,如下所示:

// 準備好域名(hostname)、端口(port)、數據庫實例名(dbname)、用戶名(username)、密碼(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);

// ... 發起查詢 ...

URL配置

PolarDB MySQL版支持通過URL鏈接中嵌入MEKENC_ALGO等參數。如下所示:

// 準備好域名(hostname)、端口(port)、數據庫實例名(dbname)、用戶名(username)、密碼(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);

// ... 發起查詢 ...

完整代碼示例(以JDBC properties配置為例)

// 以下域名(hostname)、端口(port)、數據庫實例名(dbname)、用戶名(username)、密碼(password)等連接信息需要更新為您的實例信息
String hostname = "hostname";
String port = "port";
String dbname = "db";
String username = "user";
String password = "password";

String mek="00112233445566778899aabbccddeeff";  // 只是示例,建議用更復雜的密鑰
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 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 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");
}

輸出結果如下:

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

常見問題

  • Q:運行程序時報錯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,如何處理?

    A:該報錯可能是因為您的JDK版本較高導致的模塊間權限問題,請在運行時添加VM option參數--add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMED將com.sun.crypto.provider導出給Unnamed模塊,以解決訪問權限問題。

  • Q:運行程序時報錯failed in mek provision: you might have an incorrect mek setting. Detail:gcmEncrypt error,如何處理?

    A:該問題常見于Oracle系列的JDK,如需解決此問題,您可以任選如下兩種方式之一:

    • 使用Amazon Correto系列的JDK。

    • 仍然使用Oracle系列的JDK,但需要手動配置Security provider。具體操作步驟如下:

      1. 找到JDK的安裝路徑。

      2. 安裝路徑/conf/security/路徑下,找到java.security文件。

      3. 編輯java.security文件,在List of providers and their preference orders (see above):區域,補充如下內容:

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