PolarDB Always Encrypted機能は、テキストプロトコルに基づくSQLクエリのみをサポートし、MySQLサーバーから取得した結果セット内の特定のデータを暗号化します。 次に、クライアントは、後続の操作のために暗号文の結果を復号する。 クライアントが復号化された結果セットを適切に処理するために、EncDB SDK For Javaが提供されています。 EncDB SDK for Javaは、キー管理、データの暗号化と復号化、およびエンドツーエンドの通信セキュリティ機能を提供します。 このトピックでは、EncDB SDKの使用方法について説明します。
準備
PolarDB Always Encryptedが有効になっているデータベースに接続するために必要な情報 (ホスト名、ポート、データベース名、ユーザー名、パスワードなど) を取得します。
暗号化ルールを設定します。 詳細については、「暗号化ルールの管理」トピックの暗号化ルールの作成セクションをご参照ください。
EncDB SDKの設定
Mavenプロジェクトに次の依存関係を追加します。
<dependencies>
...
<!-- MySQL Connector/Jのすべてのバージョンがサポートされています。 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>com.alibaba.encdb</groupId>
<artifactId>libencdb</artifactId>
<version>1.2.11-スナップショット </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>
...
</dependencies>
設定例
テキストプロトコルクエリを適切に解析できるMySQLクライアントを使用できます。 次のデモは、MySQL Connector/J (MavenプロジェクトのPOMファイルに導入) とEncDB SDKに基づいて作成されています。 PolarDB Always Encryptedが有効になっているPolarDBクラスターのクラスター接続情報を使用してデモを完了し、enc_int
列の暗号化ルールを設定する必要があります。
// PolarDB Always Encryptedが有効になっているデータベースに接続するために必要な情報。 エンドポイントをプライマリエンドポイントにすることはできません。
文字列hostname = "asodijasdoijaisd.rwlb.rds.aliyuncs.com";
String port = "3306";
文字列dbname = "test_db";
文字列username = "ruanbu";
文字列パスワード="123456Abc!";
Class.forName("com.mysql.cj.jdbc.Driver");
String dbUrl = String.format("jdbc:mysql:// % s:% s/% s" 、ホスト名、ポート、dbname);
java.sql.Connection conn = java.sql.DriverManager.getConnection(dbUrl、ユーザー名、パスワード);
// カスタマーマスターキー。このデモでは32ビットの16進文字列です。
String mek = "00112233445566778899aabbccddeeff";
com.alibaba.encdb.EncdbSDK sdk=
com.alibaba.encdb.crypto.EncdbSDKBuilder.newInstance()
. setKeyMgmtTyp e(com.alibaba.encdb.com mon.Constants.KeyMgmtType.MYSQL_PROXY)
. setDbConnection(conn)
. setMek (メック)
. build();
com.alibaba.encdb.Cryptor cryptor = sdk.getCryptor();
// テーブル作成テスト。
conn.createStatement().exe cuteUpdate("ドロップテーブルif exists test");
conn.createStatement().exe cuteUpdate("テーブルテストの作成 (enc_int)");
conn.createStatement().exe cuteUpdate("テスト値 (1) に挿入");
java.sql.ResultSet rs = conn.createStatement().exe cuteQuery("select * from test");
rs.next();
// 暗号文を取得します。
byte[] cipher = rs.getBytes(1);
// Cryptor.de cryptメソッドを呼び出して、プレーンテキストを取得します。
byte[] plaintex=cryptor.de crypt(cipher);
// 暗号文と平文を返します。
System.out.println("Plaintext: " + 新しい文字列 (平文) + "Ciphertext: " + 新しい文字列 (暗号));
出力:
平文: 1暗号文: QmEA/4d0ROXfA3QeUZFiu7EdlvZy4Yaa + uDnyFHvFOnVK4dtgVIzjrYI54I=
EncDB SDK for Javaの
EncdbSDKBuilder
は、EncdbSDK
クラスのコンストラクターであるcom.alibaba.encdb.crypto.EncdbSDKBuilder
を指します。 以下のAPIが使用されます。// EncdbSDKBuilderインスタンスを作成します。 EncdbSDKBuilderを構築するには、常にこのメソッドを使用します。 EncdbSDKBuilder newInstance(); // (必須) EncDB SDKに関連するキー管理操作を実行するためのデータベース接続を設定します。 この接続は、実際のビジネスで使用されるデータベース接続とは異なる場合があります。 EncdbSDKBuilder setDbConnection(java.sql.Connection dbConnection); // (必須) クライアントタイプを指定します。 MYSQL_PROXYオプションを追加します。 EncdbSDKBuilder setKeyMgmtType(KeyMgmtType kmType); // (必須) 128ビット (または16バイト) バイト [] オブジェクトである顧客マスターキーを設定します。 EncdbSDKBuilder setMek (バイト [] mek); // (オプション) 暗号化アルゴリズムを設定します。 有効値: AES_128_GCM、AES_128_CTR、AES_128_CBC、AES_128_ECB、SM4_128_CBC、SM4_128_ECB、SM4_128_GCM、およびSM4_128_CTR。 デフォルト値: SM4_128_CBC。 EncdbSDKBuilder setEncAlgo(EncAlgo encAlgo); // 上記の設定の後にEncdbSDKオブジェクトを作成します。 EncdbSDKビルド ();
EncdbSDK
は、com.alibaba.encdb.EncdbSDK
. 次のAPIが使用されます。// 暗号文または平文の操作を実行するために使用されるCryptorオブジェクトを取得します。 Cryptor getCryptor();
暗号
は、com.alibaba.encdb.暗号
. 次のAPIが使用されます。// 入力暗号文に対応する平文を取得します。 byte[] decrypt(byte[] val);