すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:クライアントから常に機密データベース機能を使用する

最終更新日:Oct 10, 2024

このトピックでは、クライアントからApsaraDB RDS for PostgreSQLインスタンスに常に機密データベース機能を使用する方法について説明します。

前提条件

  • 常に機密データベース機能が有効になっています。 詳細については、「常に機密データベース機能の有効化」をご参照ください。

  • 機密データが定義される。 詳細については、「機密データの定義」をご参照ください。

    サンプルテストテーブル

    次の例では、pricemiles、およびsecretは機密データ列です。

    CREATE TABLE example (
        id      INTEGER,
        name    VARCHAR,
        price   enc_int4,
        miles   enc_float4,
        secret  enc_text,
        PRIMARY KEY (id)
    );
  • Always機密データベースへの接続に使用される情報が取得されます。 クライアントから常に機密データベース機能を使用する前に、ドメイン名 (ホスト) 、ポート番号 (ポート) 、データベース名 (dbname) 、ユーザー名 (ユーザー名) 、パスワード (パスワード) など、常に機密データベースに関する接続情報を取得する必要があります。 RDSインスタンスの内部エンドポイントとパブリックエンドポイントを取得する方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのエンドポイントとポート番号の表示と変更」をご参照ください。

  • このトピックでは、Javaアプリケーションを例として使用します。 Java開発環境がインストールされていることを確認してください。 Java 1.8以降、Maven 3.9.2、およびIntelliJ IDEA Community Edition 2022.3.2を使用することを推奨します。

使用上の注意

マスター暗号化キー (MEK) を保存し、機密を保持する必要があります。

この機能は、クエリ結果の機密データを暗号化します。 アプリケーションでこの機能を使用するには、次の種類のクライアントからこの機能を使用できます。

接続方法

説明

ビジネスコードの変更が必要

アプリケーション

EncJDBC

EncJDBCは、暗号化するデータ型を自動的に識別し、データを暗号化または復号します。

いいえ。 この方法をお勧めします。

EncDB SDK

クライアント上のデータを暗号化または復号化するには、EncDB SDKによって提供される暗号化または復号化関数を呼び出す必要があります。

はい。

psql

psqlツールは、データベース内のデータをクエリできるコマンドラインツールです。 psqlは暗号文データのみを取得します。

いいえ。 psqlはクエリにのみ使用されるため、ビジネスコードを変更する必要はありません。

データ管理 (DMS) コンソールなどのビジュアルツールとインタラクティブツール

EncJDBC

ドライバーのダウンロードと依存関係の設定

  1. EncJDBCドライバをダウンロードします。

    EncJDBCは、コミュニティが提供するPostgreSQLドライバーに依存します。

    RDSインスタンスのマイナーエンジンバージョン

    RDSインスタンス上のEncDBのバージョン

    クライアントのEncDB依存関係パッケージ

    20230830以降

    1.1.13以降

    encjdbc-1.0.6.jar

  2. Mavenの依存関係を設定します。

    説明

    このセクションでは、Mavenを使用してクライアントを構成します。

    1. 次のコマンドを実行して、EncJDBC依存関係パッケージをオンプレミスリポジトリにインストールします。

      mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=<Name of the installed JAR package> -Dversion=<Version of the installed JAR package> -Dpackaging=jar -Dfile=<File name of the installed JAR package>

      例:

      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バージョンを使用している場合は、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>

クライアントからのデータの照会 (サンプルコード)

警告

このセクションでは、デモ用のサンプルコードを示します。 実際のビジネスコードでは、passwordおよびmekパラメーターをプレーンテキストの値に設定しないでください。 コードでパラメーターを参照する前に、外部設定ファイルや環境変数などのメソッドを使用してパラメーターを設定することをお勧めします。

  • URL設定の説明

    EncJDBCは、Java Database Connectivity (JDBC) と同じ方法で使用できます。 EncJDBCを使用する前に、データセキュリティを確保するために次の設定を実行する必要があります。

    // The connection information such as the domain name (hostname), port number (port), database name (dbname), username (username), and password (password).
    
    // For more information, see the "Data security-related parameters" section.
    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);
    
    // ... Initiate a query. ...

    データセキュリティ関連のパラメーター

    パラメーター

    例 (文字列型)

    説明

    メク

    0x00112233445566778899aabbccddeeff

    データ所有者によって指定されたMEK。

    MEK生成: OpenSSLやopenssl rand -hex 16などのパスワード生成ツールを使用したり、プログラミング言語でランダム関数を呼び出したり、Key Management Service (KMS) からキーを取得したりできます。

    有効値: 長さ32文字の16進文字列。

    警告

    MEKは、暗号化されたデータへのアクセスに使用するルート資格です。 セキュリティ上の理由から、Always機密データベースはMEKを生成、保存、バックアップしません。 CMKを生成し、安全な場所に保存する必要があります。 MEKを紛失した場合、MEKを使用して暗号化されたデータにアクセスできなくなります。 MEKをバックアップすることをお勧めします。

    enc_algo

    SM4_128_CBC

    暗号化アルゴリズム。 有効な値:

    • 国際的に受け入れられているアルゴリズム:

      • AES_128_GCM

      • AES_128_CBC

      • AES_128_ECB

    • ShangMi (SM) アルゴリズム:

      • SM4_128_GCM

      • SM4_128_CBC (これはデフォルト値です)

      • SM4_128_ECB

    説明
    • CTR暗号化アルゴリズムはサポートされていません。

    • AES_128_ECBおよびSM4_128_ECB暗号化アルゴリズムは、高いセキュリティを提供できません。 AES_128_ECBおよびSM4_128_ECB暗号化アルゴリズムよりも高いセキュリティを提供する他の暗号化アルゴリズムを選択することを推奨します。

    enc_scheme

    RND

    暗号化方法。 有効な値:

    • RND: 確率的暗号化。 デフォルト値です。

    • DET: 決定論的暗号化。

    説明

    enc_algoパラメーターをAES_128_ECBまたはSM4_128_ECBに設定した場合、このパラメーターは無効です。

    dek_gen_mode

    ENCLAVE

    データ暗号化キー (DEK) の生成に使用されるメソッド。 有効な値:

    • ENCLAVE: データベースサーバーは、信頼できるエンクレーブでDEKを生成します。 デフォルト値です。

    • LOCAL: クライアントはDEKを生成します。

    ステートレス

    true

    常に機密データベースに適用されるステートレス属性。 有効な値:

    • true: クライアントがRDSインスタンスから切断された後も、生成されたMEKは有効なままです。 デフォルト値です。

    • false: クライアントがRDSインスタンスから切断されると、生成されたMEKは無効になります。

    説明
    • 複数のパラメーターを連結するには、アンパサンド (&) を使用できます。

    • mekなどのパラメータはクライアント側で設定され、エンベロープ暗号化を使用してサーバー側に送信されます。 この処理では、mekの値の機密性が保証される。

  • 完全なサンプルコード

    // The connection information such as the domain name (hostname), port number (port), database name (dbname), username (username), and password (password). Specify the parameters based on your business requirements.
    String hostname = "hostname";
    String port = "port";
    String dbname = "db";
    String username = "user";
    String password = "password";
    
    String mek="00112233445566778899aabbccddeeff"; // This is an example value. We recommend that you use a more complex MEK.
    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インスタンスのマイナーエンジンバージョン

    RDSインスタンス上のEncDBのバージョン

    クライアントのEncDB依存関係パッケージ

    20230830以降

    1.1.13以降

    libencdb-1.2.12.jar

  2. Mavenの依存関係を設定します。

    説明

    このセクションでは、Mavenを使用してクライアントを構成します。

    1. 次のコマンドを実行して、EncDB SDK依存関係パッケージをオンプレミスリポジトリにインストールします。

      mvn install:install-file -DgroupId=com.alibaba.encdb -DartifactId=<Name of the installed JAR package> -Dversion=<Version of the installed JAR package> -Dpackaging=jar -Dfile=<File name of the installed JAR package>

      例:

      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バージョンを使用している場合は、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>

クライアントからのデータの照会 (サンプルコード)

警告

このセクションでは、デモ用のサンプルコードを示します。 実際のビジネスコードでは、passwordおよびmekパラメーターをプレーンテキストの値に設定しないでください。 コードでパラメーターを参照する前に、外部設定ファイルや環境変数などのメソッドを使用してパラメーターを設定することをお勧めします。

  • SDK設定の説明

    受信または送信する暗号文データを管理する前に、EncDB SDKを使用してデータを暗号化または復号化する必要があります。

    EncDB SDKは、SDKオブジェクトを初期化するときにデータセキュリティに関連するパラメーターを設定するために必要なAPI操作を提供します。 ほとんどの場合、setMekで指定されたMEKとsetEncAlgoで指定された必要な暗号化アルゴリズムのみを設定する必要があります。 他のパラメーターにはデフォルト設定を使用することを推奨します。

    // Obtain the connection information such as the domain name (hostname), port number (port), database name (dbname), username (username), and password (password).
    
    // Establish a database connection. All JDBC versions are supported.
    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);
    
    // Initialize the SDK.
    String mek=...;
    Constants.EncAlgo encAlgo=...;
    EncdbSDK sdk = EncdbSDKBuilder.newInstance()
            .setDbConnection(dbConnection)
            .setMek(mek)
            .setEncAlgo(encAlgo)
            .build();
    Cryptor cryptor = sdk.getCryptor();
    
    // Call the API operation for data encryption or decryption.
    // byte[] cipherBytes = cryptor.encrypt(...);
    // XXX value = cryptor.decryptXXX(...):
    
    // ... Initiate a query. ...

    SDK関連のパラメーターを初期化する

    パラメーター

    例 (文字列型)

    説明

    メック

    0x00112233445566778899aabbccddeeff

    データ所有者によって指定されたMEK。

    MEK生成: OpenSSLやopenssl rand -hex 16などのパスワード生成ツールを使用したり、プログラミング言語でランダム関数を呼び出したり、KMSからキーを取得したりできます。

    有効値: 長さが32文字、長さが16バイトのバイナリ数の16進文字列。

    警告

    MEKは、暗号化されたデータへのアクセスに使用するルート資格です。 セキュリティ上の理由から、Always機密データベースはMEKを生成、保存、バックアップしません。 CMKを生成し、安全な場所に保存する必要があります。 MEKを紛失した場合、MEKを使用して暗号化されたデータにアクセスできなくなります。 MEKをバックアップすることをお勧めします。

    エンカルゴ

    SM4_128_CBC

    暗号化アルゴリズム。 有効な値:

    • 国際的に受け入れられているアルゴリズム:

      • AES_128_GCM

      • AES_128_CBC

      • AES_128_ECB

    • SMアルゴリズム:

      • SM4_128_GCM

      • SM4_128_CBC (これはデフォルト値です)

      • SM4_128_ECB

    説明
    • CTR暗号化アルゴリズムはサポートされていません。

    • AES_128_ECBおよびSM4_128_ECB暗号化アルゴリズムは、高いセキュリティを提供できません。 AES_128_ECBおよびSM4_128_ECB暗号化アルゴリズムよりも高いセキュリティを提供する他の暗号化アルゴリズムを選択することを推奨します。

    EncScheme

    RND

    暗号化方法。 有効な値:

    • RND: 確率的暗号化。 デフォルト値です。

    • DET: 決定論的暗号化。

    説明

    EncAlgoパラメーターをAES_128_ECBまたはSM4_128_ECBに設定した場合、このパラメーターは無効です。

    DekGenMode

    ENCLAVE

    DEKを生成するために使用されるメソッド。 有効な値:

    • ENCLAVE: データベースサーバーは、信頼できるエンクレーブでDEKを生成します。 デフォルト値です。

    • LOCAL: クライアントはDEKを生成します。

    SdkMode

    デフォルト

    SDKモード。 有効な値:

    • デフォルト: Basic EditionおよびHardware-enhanced Editionで提供されるすべての暗号文データ型がサポートされます。 デフォルト値です。

    ステートレス

    true

    常に機密データベースに適用されるステートレス属性。 有効な値:

    • true: クライアントがRDSインスタンスから切断された後も、生成されたMEKは有効なままです。 デフォルト値です。

    • false: クライアントがRDSインスタンスから切断されると、生成されたMEKは無効になります。

    説明

    mekなどのパラメータはクライアント側で設定され、エンベロープ暗号化を使用してサーバー側に送信されます。 この処理では、mekの値の機密性が保証される。

  • 完全なサンプルコード

    // Update the connection information such as the domain name (hostname), port number (port), database name (dbname), username (username), and password (password) to your instance information.
    String hostname = "hostname";
    String port = "port";
    String dbname = "db";
    String username = "user";
    String password = "password";
    
    // Establish a database connection.
    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);
    
    // Initialize the SDK.
    String mek="00112233445566778899aabbccddeeff"; // This is an example value. We recommend that you use a more complex MEK.
    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操作を提供します。

// Obtain a new EncdbSDKBuilder instance. You must use this method to construct EncdbSDKBuilder. 
EncdbSDKBuilder newInstance();
// Required. Configure a database connection for libencdb-related key management. The configured database connection is different from the database connection that is used in actual business scenarios. 
EncdbSDKBuilder setDbConnection(java.sql.Connection dbConnection);
// Required. Specify the type of the client that is connected to libencdb. If you use a Always confidential MySQL database, you must specify MYSQL_PROXY.
EncdbSDKBuilder setKeyMgmtType(KeyMgmtType kmType);
// Required. Specify an MEK. The MEK must be a 16-byte byte[] object or a hexadecimal string with 32 characters in length.
EncdbSDKBuilder setMek(byte[] mek);
EncdbSDKBuilder setMek(String mekStr);
// Optional. Configure the encryption algorithm. Valid values: AES_128_GCM, AES_128_CBC, AES_128_ECB, SM4_128_CBC, SM4_128_ECB, and SM4_128_GCM. If you do not configure the encryption algorithm, SM4_128_CBC is used by default. 
EncdbSDKBuilder setEncAlgo(EncAlgo encAlgo);
// After the preceding configurations are complete, construct an EncdbSDK object.
EncdbSDK build();

com.alibaba.encdb.EncdbSDK

このモジュールは、信頼された鍵管理およびエンドツーエンドの安全な通信などの機能を提供する。 このモジュールは、次のAPI操作も提供します。

// Obtain a Cryptor object to perform operations on ciphertext and plaintext data. 
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を使用して、常に機密データベースのデータを照会できます。 たとえば、psqlを使用してSELECT * FROM example; ステートメントを実行できます。

image.png

上記の出力では、idnameはプレーンテキスト列、pricemilessecretは暗号文列です。 暗号化されたデータはRDSインスタンスで表示できません。 これにより、クラウド内外のセキュリティ上の脅威から常にデータを保護できます。

DMSコンソール

DMSコンソールなどの視覚的およびインタラクティブなツールを使用して、常に機密データベースのデータを照会できます。

image.png

上の図では、idnameはプレーンテキスト列、pricemilessecretは暗号文列です。

よくある質問

  • データベースに接続するときにorg.postgresql.util.PSQLException: ERROR: db_process_msg_api: process message failure - returned 0xf707000 0というエラーメッセージが表示された場合はどうすればよいですか?

    エラーコード0xf7070000は、MEKをインポートできないことを示します。 一方のMEKで暗号化されたデータは、他方のMEKではアクセスできない。 同じアカウントで、異なるMEKを使用して同じAlways機密データベースに接続すると、このエラーが発生する可能性があります。 Always機密データベースに接続する場合は、常に同じMEKを使用することをお勧めします。

  • 私は何をしますか?スレッド "main" java.lang.IllegalAccessErrorの例外: clas s com.alibaba.encdb.com mon.SymCrypto (無名モジュール @ 0x5c0369c4) は、モジュールjava.baseがcom.sun.cryptoを無名モジュール @ 0x5c0369c4にエクスポートしないため、クラスcom.sun.crypto.provider.SunJCE (モジュールjava.base) にアクセスできませんプログラムを実行するとエラーメッセージが表示されますか?

    このエラーメッセージは、JDKバージョンが必要なバージョンよりも新しい場合に発生するモジュール間のアクセス許可の問題が原因で表示されることがあります。 このエラーを解決するには、プログラムを実行してcom.sun.crypto.providerをUNNAMEDモジュールにエクスポートするときに、VMオプション -- add-exports=java.base/com.sun.crypto.provider=ALL-Unnamedを追加する必要があります。