機密データベースは、クエリ結果のデータを暗号化します。 EncJDBCは、常に機密機能のMySQL Java Database Connectivity (JDBC) です。 EncJDBCは、Javaシステムでコードを変更することなく、常に機密機能を提供するために提供されています。 EncJDBCは、暗号文データを自動的に復号し、平文データをアプリケーションに返すことができます。 このプロセスは、アプリケーションに対して透過的である。 常時機密機能が有効になっているインスタンスに接続するには、わずかな構成変更を実行します。アプリケーションのコードを変更する必要はありません。 このトピックでは、EncJDBCを使用してインスタンスにアクセスする方法について説明します。
前提条件
常に機密機能が有効になっています。 詳細については、「PolarDB Always-confidentialの有効化」をご参照ください。
常時機密機能が有効になっているインスタンスの接続情報を取得します。 接続情報には、ドメイン名 (ホスト) 、ポート番号 (ポート) 、インスタンス名 (dbname) 、ユーザー名 (ユーザー名) 、パスワード (パスワード) が含まれます。
データ保護ルールが設定されています。 詳細については、「暗号化ルールの管理」をご参照ください。
使用上の注意
マスター暗号化キー (MEK)
を保存し、機密を保持する必要があります。Javaバージョンは1.8以降である必要があります。
このトピックでは、Mavenのバージョンは3.9.2
で、開発ツールはIntelliJ IDEA Community Edition 2022.3.2
です。
手順
ステップ1: 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
の最新バージョンは、公式Webサイトで確認できます。
手順2: サンプルコードに基づくEncJDBCの設定
EncJDBC
は、Java Database Connectivity (JDBC) と同じ方法で使用できます。 EncJDBC
を使用する前に、データセキュリティのためにEncJDBCでMEK
やENC_ALGO
などの必要なパラメーターを設定する必要があります。 MEKはマスター暗号化キーを指定し、ENC_ALGOは暗号化アルゴリズムを指定する。 次の表に、パラメーターを示します。
パラメーター | 説明 | 例 (文字列型) |
MEK | データ所有者によって指定されたMEK。 MEK生成: OpenSSLやopenssl rand -hex 16などのパスワード生成ツールを使用したり、プログラミング言語でランダム関数を呼び出したり、Key Management Service (KMS) からキーを取得したりできます。 有効値: 長さが32文字の16バイトの16進文字列。 警告 MEKは、暗号化されたデータへのアクセスに使用するルート資格です。 セキュリティ上の理由から、常に機密機能が有効になっているインスタンスは、MEKの生成、保存、またはバックアップを行いません。 MEKを生成し、機密を保持する必要があります。 MEKを紛失した場合、MEKを使用して暗号化されたデータにアクセスできなくなります。 したがって、MEKをバックアップすることをお勧めします。 | 00112233445566778899aabbccddeeff |
ENC_ALGO | データを保護するために使用される暗号化アルゴリズム。 有効な値:
| SM4_128_CBC |
MEKとENC_ALGOの設定
次のセクションでは、MEK
パラメーターとENC_ALGO
パラメーターの設定に使用できる方法について説明します。 JDBCでパラメーターを設定するために2つ以上のメソッドを使用する場合は、JDBCプロパティの設定、設定ファイル、およびURLの設定の順序で優先されます。
複数のパラメーターを連結するには、アンパサンド (
&
) を使用できます。これらの方法では、
MEK
はクライアント側で構成され、エンベロープ暗号化を使用してサーバに送信され、MEK
の値の機密性を保証します。
JDBCプロパティ
EncJDBCで、キーとアルゴリズムをプロパティ
として設定できます。 次の例は、プロパティを構成し、EncJDBCを使用してデータベース操作を実行する方法を示しています。
// ドメイン名 (ホスト名) 、ポート番号 (ポート) 、インスタンス名 (dbname) 、ユーザー名 (ユーザー名) 、パスワード (パスワード) などの接続情報を取得します。
//...
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" 、ホスト名、ポート、dbname);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
接続接続=DriverManager.getConnection(dbUrl、props);
//... クエリを開始...
設定ファイル
PolarDB for MySQLを使用すると、設定ファイルを作成し、設定ファイルにMEKなどの必要なパラメーターを設定できます。 次に、プロジェクトでencJdbcConfigFileという名前のプロパティを指定し、プロパティの値を構成ファイルのディレクトリに設定します。 ディレクトリを指定しない場合、encjdbc.conf
ファイルが使用されます。 設定ファイルの内容:
MEK=
ENC_ALGO=
設定ファイルのディレクトリは、次の方法で指定できます。
次の図に示すように、プロジェクトのリソースディレクトリに設定ファイルを格納します。
構成ファイルをプロジェクトのルートディレクトリに格納します。 ルートディレクトリは、実行時にアプリケーションによって使用されるディレクトリです。
ファイル設定が完了したら、アプリケーションで追加の設定を構成する必要はありません。 次のサンプルコードを参照してください。
// ドメイン名 (ホスト名) 、ポート番号 (ポート) 、インスタンス名 (dbname) 、ユーザー名 (ユーザー名) 、パスワード (パスワード) などの接続情報を取得します。
//...
String dbUrl = String.format("jdbc:mysql:encdb:// % s:% s/% s" 、ホスト名、ポート、dbname);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
接続接続=DriverManager.getConnection(dbUrl、ユーザー名、パスワード);
//... クエリを開始...
URL
PolarDB for MySQLでは、URLでMEK
およびENC_ALGO
パラメーターを設定できます。 次のサンプルコードを参照してください。
// ドメイン名 (ホスト名) 、ポート番号 (ポート) 、インスタンス名 (dbname) 、ユーザー名 (ユーザー名) 、パスワード (パスワード) などの接続情報を取得します。
//...
String mek=...;
String encAlgo=...;
String dbUrl = String.format("jdbc:mysql:encdb:// % s:% s/% s?MEK=% s&ENC_ALGO=% s" 、ホスト名、ポート、dbname、mek、encAlgo);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
接続接続=DriverManager.getConnection(dbUrl、ユーザー名、パスワード);
//... クエリを開始...
JDBCプロパティ設定の完全なサンプルコード
// ドメイン名 (ホスト名) 、ポート番号 (ポート) 、インスタンス名 (dbname) 、ユーザー名 (ユーザー名) 、パスワード (パスワード) などの接続情報をインスタンス情報に更新します。
文字列hostname = "hostname";
String port = "port";
文字列dbname = "db";
文字列username = "user";
文字列password = "password";
String mek="00112233445566778899aabbccddeeff"; // これは値の例です。 より複雑なMEKを使用することをお勧めします。
文字列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" 、ホスト名、ポート、dbname);
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
接続接続=DriverManager.getConnection(dbUrl、props);
int[] intData = {1, 2, 3, 4, 5, 6};
String[] strData = {"abc", "bcd", "1", "def", "efg", "fgi"};
// テーブルの作成
connection.createStatement().exe cuteUpdate("ドロップテーブルif exists test");
connection.createStatement().exe cuteUpdate("テーブルテストの作成 (int、bテキスト)");
// データの挿入
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.exe cuteUpdate();
}
// 平文データのチェック
ResultSet rs = connection.createStatement().exe cuteQuery("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
FAQ
私は何をしますか?
スレッド "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
を追加する必要があります。がmekの規定に失敗した場合の対処方法: mekの設定が正しくない可能性があります。 詳細: プログラムを実行するとgcmEncryptエラー
メッセージが表示されますか?このエラーは、Oracle JDKの一般的なエラーです。 エラーを解決するには、次のいずれかの方法を使用します。
代わりにAmazon Correttoを使用します。
Oracle JDKを使用する場合は、次の手順を実行してセキュリティプロバイダーを構成する必要があります。
JDKのインストールパスを見つけます。
<Installation path>/conf/security/
ディレクトリで、java.security
ファイルを見つけます。java.security
ファイルを編集します。[プロバイダーのリストとその優先順位 (上記参照)]
セクションで、次のコンテンツを追加します。security.provider.14=org.bouncycastle.jce.provider.BouncyCastleProvider