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

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

最終更新日:Jun 28, 2024

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

前提条件

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

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

    サンプルテストテーブル

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

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

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

使用上の注意

master encryption key (MEK) が安全に保存されていることを確認します。

常時機密データベース機能は、クエリ結果の機密データを暗号化します。 アプリケーションは、以下のタイプのクライアントから常に機密のデータベース機能を使用できます。

接続方法

説明

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

アプリケーション

EncJDBC

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

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

EncDB SDK

アプリケーションは、EncDB SDKが提供する関数を使用して、データを暗号化または復号できます。

はい。

psql

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

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

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

EncJDBC

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

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

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

    PolarDB for PostgreSQLマイナーバージョン

    PolarDB for PostgreSQLクラスター上のEncDBのバージョン

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

    PolarDB for PostgreSQL 14: 20231030 (14.9.14.0) 以降

    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 of this topic.
    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 ...

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

    パラメーター

    例 (文字列型)

    説明

    mek

    0x00112233445566778899aabbccddeeff

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

    次のいずれかの方法を使用してMEKを取得できます。OpenSSLやopenssl rand -hex 16などのパスワード生成ツールを使用するか、プログラミング言語でランダム関数を呼び出すか、サードパーティのキー管理サービス (KMS) を使用します。

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

    警告

    MEKは、暗号化されたデータへのアクセスに使用するルート資格です。 セキュリティを確保するために、常時機密データベース機能はMEKを生成、保存、またはバックアップしません。 手動でMEKを生成し、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暗号化アルゴリズムは、高いセキュリティを保証できません。 より高いセキュリティを提供する他の暗号化アルゴリズムを選択することを推奨します。

    enc_scheme

    RND

    暗号化方法。 有効な値:

    • RND (デフォルト): 確率的暗号化。

    • DET: 決定論的暗号化。

    説明

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

    dek_gen_mode

    ENCLAVE

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

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

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

    stateless

    true

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

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

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

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

    • mekパラメータおよび他のパラメータは、クライアント側で構成され、エンベロープ暗号化を使用することによってサーバ側に送信される。 この処理では、mek値の機密性が確保される。

  • 完全なサンプルコード

    // The connection information of your cluster, including the domain name (hostname), port number (port), database name (dbname), username (username), and password (password).
    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ドライバーに依存します。

    PolarDB for PostgreSQLマイナーバージョン

    PolarDB for PostgreSQLクラスター上のEncDBのバージョン

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

    PolarDB for PostgreSQL 14: 20231030 (14.9.14.0) 以降

    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=encjdbc -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>
         ...
      </dependencies>

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

警告

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

  • SDK設定の説明

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

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

    // Obtain the connection information including 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(connection)
            .setMek(mek)
            .setEncAlgo(encAlgo)
            .build();
    Cryptor cryptor = sdk.getCryptor();
    
    // Invoke the API operation for data encryption or decryption.
    // byte[] cipherBytes = cryptor.encrypt(...);
    // XXX value = cryptor.decryptXXX(...):
    
    // ... Initiate a query ...

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

    パラメーター

    例 (文字列型)

    説明

    Mek

    0x00112233445566778899aabbccddeeff

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

    次のいずれかの方法を使用してMEKを取得できます。OpenSSLやopenssl rand -hex 16などのパスワード生成ツールを使用するか、プログラミング言語でランダム関数を呼び出すか、サードパーティのKMSを使用します。

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

    警告

    MEKは、暗号化されたデータへのアクセスに使用するルート資格です。 セキュリティを確保するために、常時機密データベース機能はMEKを生成、保存、またはバックアップしません。 手動でMEKを生成し、MEKが安全に保存されていることを確認する必要があります。 MEKを紛失すると、既存の暗号化データにアクセスできなくなります。 MEKをバックアップすることをお勧めします。

    EncAlgo

    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暗号化アルゴリズムは、高いセキュリティを保証できません。 より高いセキュリティを提供する他の暗号化アルゴリズムを選択することを推奨します。

    EncScheme

    RND

    暗号化方法。 有効な値:

    • RND (デフォルト): 確率的暗号化。

    • DET: 決定論的暗号化。

    説明

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

    DekGenMode

    ENCLAVE

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

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

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

    SdkMode

    Default

    SDKモード。 有効な値:

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

    Stateless

    true

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

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

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

    説明

    mekパラメータおよび他のパラメータは、クライアント側で構成され、エンベロープ暗号化を使用することによってサーバ側に送信される。 この処理では、mek値の機密性が確保される。

  • 完全なサンプルコード

    // The connection information of your cluster, including the domain name (hostname), port number (port), database name (dbname), username (username), and password (password).
    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(connection)
            .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 > ?";
    PreparedStatement 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);
        int price = cryptor.decryptInt(rs.getBytes(3));
        float 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操作をサポートします。

// Creates an EncdbSDKBuilder instance. Use this method to construct EncdbSDKBuilder. 
EncdbSDKBuilder newInstance();
// Required. Configure a database connection for libencdb-related key management. The connection can be different from the database connection used in the actual business scenario. 
EncdbSDKBuilder setDbConnection(java.sql.Connection dbConnection);
// Required. Specify the type of the client that is connected to libencdb. If you use a confidential MySQL database, specify MYSQL_PROXY.
EncdbSDKBuilder setKeyMgmtType(KeyMgmtType kmType);
// Required. Specify an MEK. The MEK must be a 16-byte byte[] object or a hexadecimal string that has 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. 
EncdbSDKBuilder setEncAlgo(EncAlgo encAlgo);
// Constructs an EncdbSDK object after the preceding configurations are complete.
EncdbSDK build();

com.alibaba.encdb.EncdbSDK

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

// Obtains a Cryptor object used to perform operations on the ciphertext or plaintext. 
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は暗号文列です。 暗号化されたデーlタは、PolarDB for PostgreSQLクラスターで表示できません。 これにより、クラウド内外のセキュリティ上の脅威から常にデータを保護できます。

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を使用して同じ常時機密データベースに接続すると、このエラーが発生する可能性があります。 常に機密性の高いデータベースに接続するには、同じMEKを使用することをお勧めします。