全部產品
Search
文件中心

ApsaraDB RDS:用戶端使用說明

更新時間:Sep 28, 2024

本文介紹如何通過用戶端使用全密態資料庫功能。

前提條件

  • 已開通全密態資料庫。更多資訊,請參見開通全密態資料庫

  • 已定義敏感性資料。具體操作,請參見定義敏感性資料

    本文使用的測試表

    pricemilessecret為敏感性資料列

    CREATE TABLE example (
        id      INTEGER,
        name    VARCHAR,
        price   enc_int4,
        miles   enc_float4,
        secret  enc_text,
        PRIMARY KEY (id)
    );
  • 擷取加密資料庫串連資訊。您首先需要擷取加密資料庫的串連資訊,如網域名稱(host)、連接埠(port)、資料庫執行個體名(dbname)、使用者名稱(username)、密碼(password)等。執行個體內外網地址擷取方式請參見查看或修改串連地址和連接埠

  • 本文中介紹的應用程式使用的開發語言為Java,請確保已具備Java開發環境,建議使用Java版本為1.8及以上,Maven版本為3.9.2,使用的開發工具為IntelliJ IDEA Community Edition 2022.3.2

注意事項

請儲存好您設定的主要金鑰MEK

用戶端使用樣本

全密態資料庫對查詢結果中的目標敏感性資料進行加密。為了讓應用能夠使用全密態功能,全密態支援以下用戶端接入:

接入方式

說明

是否需要改動業務代碼

應用程式

EncJDBC

自動識別加密資料類型並對資料進行加密解密。

(推薦使用)基本不需要改動業務代碼。

EncDB SDK

在用戶端調用EncDB SDK提供的加解密函數,對明文資料進行加密或者對密文資料進行解密。

需要。

psql命令列工具

直接連接資料庫查詢,只顯示密文資料。

僅用於查詢,不進行業務開發,無需改動業務代碼。

DMS控制台等可視化互動工具

EncJDBC

下載驅動程式及依賴配置

  1. 下載EncJDBC驅動。

    EncJDBC依賴於社區提供的PostgreSQL驅動工作。

    RDS PostgreSQL小版本

    服務端encdb外掛程式版本號碼

    用戶端EncDB依賴包

    20230830或以上版本

    1.1.13或以上版本

    encjdbc-1.0.6.jar

  2. Maven依賴配置。

    說明

    本樣本以Maven構建Java專案為例。

    1. 通過如下命令將EncJDBC依賴包安裝至您的本地倉庫:

      mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=<安裝的Jar包名> -Dversion=<安裝的Jar版本> -Dpackaging=jar -Dfile=<安裝的Jar包檔案名稱>

      樣本:

      mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=encjdbc -Dversion=1.0.6 -Dpackaging=jar -Dfile=D:\encdb\libs\encjdbc-1.0.6.jar
      說明
      • 此樣本中EncDB依賴包在D:\encdb\libs路徑下。

      • 此樣本使用的Maven版本為3.9.2,如果您安裝報錯,請升級Maven版本後再試。

    2. 在本地倉庫安裝EncJDBC依賴包的基礎上,您需要在自己的Maven專案pom.xml設定檔中加入以下依賴項。

      <dependencies>
         ...
         <dependency>
            <groupId>com.alibaba.encdb</groupId>
            <artifactId>encjdbc</artifactId>
            <version>1.0.6</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcprov-jdk15on</artifactId>
           <version>1.62</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcpkix-jdk15on</artifactId>
           <version>1.62</version>
         </dependency>
         <dependency>
           <groupId>com.alibaba.fastjson2</groupId>
           <artifactId>fastjson2</artifactId>
           <version>2.0.2</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
         <dependency>
           <groupId>org.postgresql</groupId>
           <artifactId>postgresql</artifactId>
           <version>42.2.23</version>
         </dependency>
         <dependency>
           <groupId>com.google.guava</groupId>
           <artifactId>guava</artifactId>
           <version>24.1.1-jre</version>
         </dependency>
         <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>druid</artifactId>
           <version>1.2.4</version>
         </dependency>
         <dependency>
           <groupId>org.jgrapht</groupId>
           <artifactId>jgrapht-core</artifactId>
           <!-- jgrapht does not support java 1.8 since 1.5.0 -->
           <version>1.4.0</version>
        </dependency>
         ...
      </dependencies>

通過全密態用戶端查詢(程式碼範例)

警告

本樣本所展示的代碼僅用於示範配置方式,請勿在實際業務代碼中將passwordmek以明文方式設定在代碼中,建議使用外部設定檔或環境變數等其他方式進行處理後,再在代碼中引用。

  • URL配置說明

    您可以像使用任意一個JDBC一樣使用EncJDBC。但是您需要預先在EncJDBC中配置和您資料安全相關的如下資訊。

    // 準備好網域名稱(hostname)、連接埠(port)、資料庫名稱(dbname)、使用者名稱(username)、密碼(password)等串連資訊
    
    // 詳見資料安全相關參數
    String mek=...;
    String encAlgo=...;
    
    String dbUrl = String.format("encjdbc:postgresql://%s:%s/%s?mek=%s&enc_algo=%s", hostname, port, dbname, mek, encAlgo);
    Class.forName("com.alibaba.encdb.encjdbc.EncDriver");
    
    Connection dbConnection = DriverManager.getConnection(dbUrl, username, password);
    
    // ... 發起查詢 ...

    資料安全相關參數

    參數

    取值樣本(字串類型)

    說明

    mek

    0x00112233445566778899aabbccddeeff

    使用者主要金鑰,由使用者自訂指定。

    常見的產生方法有:密碼產生工具(如openssl, openssl rand -hex 16)、程式設計語言中的random函數、或者從第三方Key Management Service(KMS)擷取。

    取值範圍:十六進位字串,長度為32個字元。

    警告

    使用者主要金鑰是您訪問加密資料的根憑據,出於安全考慮,全密態資料庫不持有並管理您的主要金鑰,也不提供使用者主要金鑰的產生和備份服務,您需要自行產生使用者主要金鑰。一旦您丟失密鑰,將無法再訪問已有的資料。因此我們建議您妥善備份使用者主要金鑰。

    enc_algo

    SM4_128_CBC

    密碼編譯演算法。取值範圍:

    • 國際演算法:

      • AES_128_GCM

      • AES_128_CBC

      • AES_128_ECB

    • 國密演算法:

      • SM4_128_GCM

      • SM4_128_CBC(預設值)

      • SM4_128_ECB

    說明
    • CTR密碼編譯演算法暫不支援。

    • AES_128_ECB和SM4_128_ECB密碼編譯演算法安全性較弱,請謹慎使用,推薦適用其他安全性更高的密碼編譯演算法。

    enc_scheme

    RND

    加密方案。取值範圍:

    • RND(預設值):隨機加密。

    • DET:確定性加密。

    說明

    enc_algo取值為AES_128_ECB或SM4_128_ECB時,該參數取值無效。

    dek_gen_mode

    ENCLAVE

    產生資料密鑰的方式。取值範圍:

    • ENCLAVE(預設值):由資料庫服務端在可信Enclave內產生資料密鑰DEK。

    • LOCAL:由用戶端產生資料密鑰DEK。

    stateless

    true

    加密資料庫Stateless模式。取值範圍:

    • true(預設值):MEK在連結斷開後不會失效。

    • false:MEK在連結斷開後失效。

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

    • mek及其他參數均在用戶端本地進行處理、並以安全方式進行分發(信封加密)到服務端,始終保證mek不泄露。

  • 完整程式碼範例

    // 以下網域名稱(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";
    
    String dbUrl = String.format("encjdbc:postgresql://%s:%d/%s?mek=%s&enc_algo=%s", hostname, port, dbname, mek, encAlgo);
    Class.forName("com.alibaba.encdb.encjdbc.EncDriver");
    Connection dbConnection = DriverManager.getConnection(dbUrl, username, password);
    
    // create table
    dbConnection.createStatement().executeUpdate("DROP TABLE IF EXISTS example");
    dbConnection.createStatement().executeUpdate("CREATE TABLE example (id INTEGER, name VARCHAR, price enc_int4, miles enc_float4, secret enc_text, PRIMARY KEY (id))");
    
    // insert data
    PreparedStatement stmt = dbConnection.prepareStatement("INSERT INTO example (id, name, price, miles, secret) VALUES(?,?,?,?,?)");
    int price = 1234;
    float miles = 12.34f;
    String secret = "aliyun";
    stmt.setInt(1, 1);
    stmt.setString(2, "name");
    stmt.setInt(3, price);
    stmt.setFloat(4, miles);
    stmt.setString(5, secret);
    stmt.execute();
    
    // check plaintext data
    String sqlCmd = "SELECT * FROM example WHERE  price > ?";
    PreparedStatement stmt = dbConnection.prepareStatement(sqlCmd);
    stmt.setInt(1, 100);
    ResultSet rs = stmt.executeQuery();
    while (rs.next()){
        int id = rs.getInt(1);
        String name = rs.getString(2);
        int price = rs.getInt(3);
        float miles = rs.getFloat(4);
        String secret = rs.getString(5);
        System.out.println(id + ", " + name + ", " + price + ", " + miles + ", " + secret);  
    }

    輸出結果樣本:

    1, name, 1234, 12.34, aliyun

通過上述EncJDBC程式碼範例,可以看到,以上過程僅修改了驅動載入以及URL配置部分,其他過程與普通資料庫訪問完全一致。您不需要修改任何業務相關代碼。

EncDB SDK

下載驅動程式及依賴配置

  1. 下載EncDB SDK驅動。

    EncDB SDK依賴於社區提供的PostgreSQL驅動工作。

    RDS PostgreSQL小版本

    服務端encdb外掛程式版本號碼

    用戶端EncDB依賴包

    20230830或以上版本

    1.1.13或以上版本

    libencdb-1.2.12.jar

  2. Maven依賴配置。

    說明

    本樣本以Maven構建Java專案為例。

    1. 通過如下命令將EncDB SDK依賴包安裝至您的本地倉庫:

      mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=<安裝的Jar包名> -Dversion=<安裝的Jar版本> -Dpackaging=jar -Dfile=<安裝的Jar包檔案名稱>

      樣本:

      mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=libencdb -Dversion=1.2.12 -Dpackaging=jar -Dfile=D:\encdb\libs\libencdb-1.2.12.jar
      說明
      • 此樣本中EncDB依賴包在D:\encdb\libs路徑下。

      • 此樣本使用的Maven版本為3.9.2,如果您安裝報錯,請升級Maven版本後再試。

    2. 在本地倉庫安裝EncDB SDK依賴包的基礎上,您需要在自己的Maven專案pom.xml設定檔中加入以下依賴項。

      <dependencies>
         ...
         <dependency>
            <groupId>com.alibaba.encdb</groupId>
            <artifactId>libencdb</artifactId>
            <version>1.2.12</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcprov-jdk15on</artifactId>
           <version>1.70</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
         <dependency>
           <groupId>org.bouncycastle</groupId>
           <artifactId>bcpkix-jdk15on</artifactId>
           <version>1.70</version>
         </dependency>
         <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.10.1</version>
          </dependency>
         <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
         <dependency>
           <groupId>org.postgresql</groupId>
           <artifactId>postgresql</artifactId>
           <version>42.2.23</version>
         </dependency>
         <dependency>
           <groupId>com.google.guava</groupId>
           <artifactId>guava</artifactId>
           <version>31.1-jre</version>
         </dependency>
         <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
         </dependency>
         <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.4</version>
          </dependency>
         ...
      </dependencies>

通過全密態用戶端查詢(程式碼範例)

警告

本樣本所展示的代碼僅用於示範配置方式,請勿在實際業務代碼中將passwordmek以明文方式設定在代碼中,建議使用外部設定檔或環境變數等其他方式進行處理後,再在代碼中引用。

  • SDK配置說明

    您需要在處理收發密文資料前,使用EncDB SDK對資料進行加解密。

    EncDB SDK提供了對應的介面,用於您初始化SDK對象時配置和您資料安全相關的參數。通常您只需要配置主要金鑰(setMek)以及期望的密碼編譯演算法(setEncAlgo),其他參數建議您使用預設預設配置。

    // 準備好網域名稱(hostname)、連接埠(port)、資料庫執行個體名(dbname)、使用者名稱(username)、密碼(password)等串連資訊
    
    // 建立資料庫連接,任意JDBC版本均可
    String dbUrl = String.format("jdbc:postgresql://%s:%s/%s?binaryTransfer=true", hostname, port, dbname);
    Class.forName("org.postgresql.Driver");
    Connection dbConnection = DriverManager.getConnection(dbUrl, username, password);
    
    // 初始化SDK
    String mek=...;
    Constants.EncAlgo encAlgo=...;
    EncdbSDK sdk = EncdbSDKBuilder.newInstance()
            .setDbConnection(dbConnection)
            .setMek(mek)
            .setEncAlgo(encAlgo)
            .build();
    Cryptor cryptor = sdk.getCryptor();
    
    // 調用加解密介面
    // byte[] cipherBytes = cryptor.encrypt(...);
    // XXX value = cryptor.decryptXXX(...):
    
    // ... 發起查詢 ...

    初始化SDK相關參數

    參數

    取值樣本(字串類型)

    說明

    Mek

    0x00112233445566778899aabbccddeeff

    使用者主要金鑰,由使用者自訂指定。

    常見的產生方法有:密碼產生工具(如openssl, openssl rand -hex 16)、程式設計語言中的random函數、或者從第三方Key Management Service(KMS)擷取。

    取值範圍:十六進位字串,長度為32個字元,或者長度為16位元組的位元。

    警告

    使用者主要金鑰是您訪問加密資料的根憑據,出於安全考慮,全密態資料庫不持有並管理您的主要金鑰,也不提供使用者主要金鑰的產生和備份服務,您需要自行產生使用者主要金鑰。一旦您丟失密鑰,將無法再訪問已有的資料。因此我們建議您妥善備份使用者主要金鑰。

    EncAlgo

    SM4_128_CBC

    密碼編譯演算法。取值範圍:

    • 國際演算法:

      • AES_128_GCM

      • AES_128_CBC

      • AES_128_ECB

    • 國密演算法:

      • SM4_128_GCM

      • SM4_128_CBC(預設值)

      • SM4_128_ECB

    說明
    • CTR密碼編譯演算法暫不支援。

    • AES_128_ECB和SM4_128_ECB密碼編譯演算法安全性較弱,請謹慎使用,推薦適用其他安全性更高的密碼編譯演算法。

    EncScheme

    RND

    加密方案。取值範圍:

    • RND(預設值):隨機加密。

    • DET:確定性加密。

    說明

    EncAlgo取值為AES_128_ECB或SM4_128_ECB時,該參數取值無效。

    DekGenMode

    ENCLAVE

    產生資料密鑰的方式。取值範圍:

    • ENCLAVE(預設值):由資料庫服務端在可信Enclave內產生資料密鑰DEK。

    • LOCAL:由用戶端產生資料密鑰DEK。

    SdkMode

    Default

    SDK模式。取值範圍:

    • Default(預設值):可以支援全密態基礎版以及硬體加固版提供的所有密文資料類型。

    Stateless

    true

    加密資料庫Stateless模式。取值範圍:

    • true(預設值):MEK在連結斷開後不會失效。

    • false:MEK在連結斷開後失效。

    說明

    mek及其他參數均在用戶端本地進行處理、並以安全方式進行分發(信封加密)到服務端,始終保證mek不泄露。

  • 完整程式碼範例

    // 以下網域名稱(hostname)、連接埠(port)、資料庫執行個體名(dbname)、使用者名稱(username)、密碼(password)等串連資訊需要更新為您的執行個體資訊
    String hostname = "hostname";
    String port = "port";
    String dbname = "db";
    String username = "user";
    String password = "password";
    
    // 建立資料庫連接
    String dbUrl = String.format("jdbc:postgresql://%s:%s/%s?binaryTransfer=true", hostname, port, dbname);
    Class.forName("org.postgresql.Driver");
    Connection dbConnection = DriverManager.getConnection(dbUrl, username, password);
    
    // 初始化SDK
    String mek="00112233445566778899aabbccddeeff";  // 只是樣本,建議用更複雜的密鑰
    Constants.EncAlgo encAlgo=Constants.EncAlgo.SM4_128_CBC;
    EncdbSDK sdk = EncdbSDKBuilder.newInstance()
            .setDbConnection(dbConnection)
            .setMek(mek)
            .setEncAlgo(encAlgo)
            .build();
    Cryptor cryptor = sdk.getCryptor();
    
    // create table
    dbConnection.createStatement().executeUpdate("DROP TABLE IF EXISTS example");
    dbConnection.createStatement().executeUpdate("CREATE TABLE example (id INTEGER, name VARCHAR, price enc_int4, miles enc_float4, secret enc_text, PRIMARY KEY (id))");
    
    // insert data
    PreparedStatement stmt = dbConnection.prepareStatement("INSERT INTO example (id, name, price, miles, secret) VALUES(?,?,?,?,?)");
    int price = 1234;
    float miles = 12.34f;
    String secret = "aliyun";
    stmt.setInt(1, 1);
    stmt.setString(2, "name");
    stmt.setBytes(3, cryptor.encrypt("example", "price", price));
    stmt.setBytes(4, cryptor.encrypt("example", "miles", miles));
    stmt.setBytes(5, cryptor.encrypt("example", "secret", secret));
    stmt.execute();
    
    // check plaintext data
    String sqlCmd = "SELECT * FROM example WHERE  price > ?";
    stmt = dbConnection.prepareStatement(sqlCmd);
    stmt.setBytes(1, cryptor.encrypt("example", "price", 100));
    ResultSet rs = stmt.executeQuery();
    while (rs.next()) {
        int id = rs.getInt(1);
        String name = rs.getString(2);
        price = cryptor.decryptInt(rs.getBytes(3));
        miles = cryptor.decryptFloat(rs.getBytes(4));
        String text = cryptor.decryptString(rs.getBytes(5));
        System.out.println(id +", " + name + ", " + price + ", " + miles + ", " + text);
    }

    輸出結果樣本:

    1, name, 1234, 12.34, aliyun

相關參考

Java SDK模組介紹

EncDB SDK主要包含以下幾個Java功能模組:

com.alibaba.encdb.crypto.EncdbSDKBuilder

該模組為EncDB SDK的構造類。提供如下API:

// 擷取一個新的EncdbSDKBuilder執行個體。您總是應該用這個方法來構造EncdbSDKBuilder。
EncdbSDKBuilder newInstance();
// (必選)設定一個資料庫連接,用於libencdb相關的密鑰管理動作。這個資料庫連接可以獨立於業務中實際用到的資料庫連接。
EncdbSDKBuilder setDbConnection(java.sql.Connection dbConnection);
// (必選)設定libencdb對接的用戶端類型。對於全密態MySQL,您應該設定MYSQL_PROXY選項
EncdbSDKBuilder setKeyMgmtType(KeyMgmtType kmType);
// (必選)設定使用者主要金鑰。這裡我們要求16位元組的byte[]對象,或者長度為32個字元的十六進位串
EncdbSDKBuilder setMek(byte[] mek);
EncdbSDKBuilder setMek(String mekStr);
// (可選)設定密碼編譯演算法。可選項有AES_128_GCM、AES_128_CBC、AES_128_ECB、SM4_128_CBC、SM4_128_ECB、SM4_128_GCM。不設定的話預設為SM4_128_CBC。
EncdbSDKBuilder setEncAlgo(EncAlgo encAlgo);
// 在完成上述設定之後,構造一個EncdbSDK對象
EncdbSDK build();

com.alibaba.encdb.EncdbSDK

該模組提供可信密鑰管理、端到端安全通訊功能。提供如下API:

// 擷取一個Cryptor對象,用於操作密文/明文。
Cryptor getCryptor();

com.alibaba.encdb.Cryptor

該模組提供密碼計算功能。提供如下API:

/**
 * @brief Encrypt interface
 *
 * @param schemaName schema name, used together with table name and column name to look up user's data encryption key from the given database connection.
 *
 * @param tblName    table name, used together with column name to look up user's data encryption key from the given database connection.
 *
 * @param colName    column name, used together with table name. To use user's default data encryption key, set tblName = "default", colName="default"
 *
 * @param type       a valid encdb Type
 * @param val        value
 * @return           encrypted bytes
 */
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, byte[] val);
byte[] encrypt(String schemaName, String tblName, String colName, byte[] val);
byte[] encrypt(String tblName, String colName, EncType type, byte[] val);
byte[] encrypt(String tblName, String colName, byte[] val);
// for int
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, int val);
byte[] encrypt(String schemaName, String tblName, String colName, int val);
byte[] encrypt(String tblName, String colName, EncType type, int val);
byte[] encrypt(String tblName, String colName, int val);
// for long
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, long val);
byte[] encrypt(String schemaName, String tblName, String colName, long val);
byte[] encrypt(String tblName, String colName, EncType type, long val);
byte[] encrypt(String tblName, String colName, long val);
// for float
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, float val);
byte[] encrypt(String schemaName, String tblName, String colName, float val);
byte[] encrypt(String tblName, String colName, EncType type, float val);
byte[] encrypt(String tblName, String colName, float val);
// for double
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, double val);
byte[] encrypt(String schemaName, String tblName, String colName, double val);
byte[] encrypt(String tblName, String colName, EncType type, double val);
byte[] encrypt(String tblName, String colName, double val);
// for String
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, String val);
byte[] encrypt(String schemaName, String tblName, String colName, String val);
byte[] encrypt(String tblName, String colName, EncType type, String val);
byte[] encrypt(String tblName, String colName, String val);
// for BigDecimal
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, BigDecimal val);
byte[] encrypt(String schemaName, String tblName, String colName, BigDecimal val);
byte[] encrypt(String tblName, String colName, EncType type, BigDecimal val);
byte[] encrypt(String tblName, String colName, BigDecimal val);
// for Timestamp
byte[] encrypt(String schemaName, String tblName, String colName, EncType type, Timestamp val);
byte[] encrypt(String schemaName, String tblName, String colName, Timestamp val);
byte[] encrypt(String tblName, String colName, EncType type, Timestamp val);
byte[] encrypt(String tblName, String colName, Timestamp val);


/**
 * @brief Decrypt interface
 *
 * @param schemaName schema name, used together with table name and column name to look up user's data encryption key from the given database connection.
 *
 * @param tblName    table name, used together with column name to look up user's data encryption key.
 *
 * @param colName    column name, used together with table name. To use user's default data encryption key,
 *                set tblName = "default", colName="default"
 *
 * @param val        val can be in either hex binary format or pg bytea bytes, e.g., \\x00621c14
 * @return           decrypted value is in hex binary format or given type format
 */
byte[] decrypt(String schemaName, String tblName, String colName, byte[] val);
byte[] decrypt(String tblName, String colName, byte[] val);
byte[] decrypt(byte[] val);
// Decrypt interface for `int`
int decryptInt(byte[] val);
// Decrypt interface for `long`
long decryptLong(byte[] val);
// Decrypt interface for `float`
float decryptFloat(byte[] val);
// Decrypt interface for `double`
double decryptDouble(byte[] val);
// Decrypt interface for `String`
String decryptString(byte[] val);
// Decrypt interface for `BigDecimal`
BigDecimal decryptDecimal(byte[] val);
// Decrypt interface for `TimeStamp`
Timestamp decryptTimestamp(byte[] val);

psql命令列

全密態資料庫支援命令列直接查詢,例如psql命令列執行SELECT * FROM example;

image.png

可以看到,idname列是明文,pricemilessecret列是密文。已被加密的資料在伺服器端無法查看,能夠有效防禦來自雲平台外部和內部的安全威脅,時刻保護使用者資料。

DMS控制台

全密態資料庫支援通過DMS等可視化互動工具直接查詢,例如DMS。

image.png

可以看到,idname列是明文,pricemilessecret列是密文。

常見問題

  • Q:串連資料庫提示報錯org.postgresql.util.PSQLException: ERROR: db_process_msg_api: process message failure - returned 0xf7070000

    A:錯誤碼0xf7070000表示MEK密鑰匯入失敗。可能原因為同一個帳號在串連同一個加密資料庫時,使用了不同的MEK,更換主要金鑰會導致原祕密金鑰加密的資料無法訪問,請使用原密鑰串連資料庫。

  • 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模組,以解決存取權限問題。