Go アプリケーションを介して RDS MySQL または PolarDB MySQL データベーステーブルの暗号化されたカラムのプレーンテキストにアクセスするには、alibabacloud-encdb-mysql-go-client ドライバを利用できます。このトピックでは、alibabacloud-encdb-mysql-go-client を使用してデータベースに接続し、暗号化されたカラムのプレーンテキストにアクセスする方法について説明します。
背景情報
カラム暗号化機能を使用すると、特定のデータベースカラムを暗号化して安全に保存できるため、データセキュリティが向上します。暗号化されたデータはデータベースに暗号文として保存されますが、承認されたクライアントはプレーンテキストを透過的に復号化してアクセスできます。
Alibaba Cloud は、Go 用の包括的な機密クライアントドライバである alibabacloud-encdb-mysql-go-client を提供しています。ユーザーはクライアント側でこのドライバを利用し、データベースに接続し、データベース接続 URL にマスター暗号鍵(MEK)を含めるだけで、暗号化されたデータベースにアクセスできます。ドライバは暗号文をシームレスに復号化し、プレーンテキストデータを取得します。 MEK
MEK: 非対称暗号化プロトコルを介してクライアントからデータベースサーバーに安全に送信されます。これにより、サーバーとクライアントの両方が同じ鍵を持つことが保証され、対称暗号化による安全なデータ送信が可能になります。
有効値の範囲: 16 バイトの 16 進数文字列、32 文字。
MEK は、承認されたクライアントが暗号化データにアクセスするためのルート資格情報です。セキュリティ上の理由から、暗号化データベースは MEK を保存または管理せず、MEK の生成またはバックアップサービスを提供しません。MEK は自分で生成する必要があります。MEK の適切な保存と管理は、データベースのセキュリティにとって非常に重要です。したがって、MEK を適切にバックアップすることをお勧めします。
前提条件
ターゲットデータベースでカラム暗号化が構成されており、データベースアカウントの暗号文権限が [暗号文権限 (JDBC 復号化)] に設定されています。データベースカラム暗号化の設定方法とアカウント権限の説明については、「カラム暗号化」をご参照ください。
暗号化されたデータベース接続情報(接続アドレス、ポート、データベース名、データベースアカウント、パスワード)を取得済みです。
MEKは、00112233445566778899aabbccddeeff などの 32 文字の 16 進数文字列として生成されます。一般的な生成方法には、パスワード生成ツールやプログラミング言語の random 関数などがあります。
次に例を示します。
Linux システムに付属の OpenSSL ツール。
openssl rand -hex 16を実行して鍵を生成します。Windows システムの場合は、OpenSSL パッケージ をインストールしてください。
注意事項
設定したマスターキー
MEKを安全に保管してください。Go バージョン 1.18 以降を使用する必要があります。
クライアントアクセス手順
1. ドライバを取得する
alibabacloud-encdb-mysql-go-client は、GoLang MySQL ドライバ の Community Edition と完全に互換性があり、標準の GoLang database/sql/driver インターフェースをサポートしているため、ビジネス側で変更を加えることなくシームレスに統合できます。
ドライバはオープンソースであり、GitHub で入手できます。詳細な手順については、「alibabacloud-encdb-mysql-go-client」をご参照ください。
証明書の拇印を取得するには、次の手順に従います。
go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latest2. 構成するMEK およびデータベースに接続する
URL 構成方法を使用する場合は、複数のパラメーターを
&で連結します。MEKはクライアント上でローカルに処理され、エンベロープ暗号化を使用してサーバーに安全に送信されるため、MEKの機密性が維持されます。
サンプルコードを以下に示します。
// ホスト名、ポート、データベースインスタンス名(dbname)、ユーザー名、パスワードなどの以下の接続情報は、インスタンス情報に更新する必要があります。
db, err := sql.Open("encmysql", "<username>:<password>@tcp(<hostname>:<port>)/<dbname>?MEK=00112233445566778899aabbccddeeff")
if err != nil {
panic(err)
}3. 暗号化されたカラムのプレーンテキストデータをクエリする
サンプルコードを以下に示します。
// クエリを開始する
rows, err := db.Query("SELECT * FROM sddp_test_mask")
if err != nil {
log.Fatalf("データのクエリに失敗しました: %v", err)
}
// 使用後は必ず結果セットを閉じる
defer rows.Close()
// 各行のデータを格納する変数を定義する
var id int
var name string
var password string
var age int
// 各行のデータをトラバースする
for rows.Next() {
// 現在の行のデータを変数にスキャンする
err := rows.Scan(&id, &name, &password, &age)
if err != nil {
log.Fatalf("行のスキャンに失敗しました: %v", err)
}
// 現在の行のデータを出力する
fmt.Printf("read data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
}完全なコード例
たとえば、[暗号文権限 (JDBC 復号化)] を持つデータベースアカウントを使用して、PolarDB MySQL データベースの暗号化されたカラムからプレーンテキストデータを取得できます。
詳細については、「列の暗号化結果の検証」のPolarDB for MySQL データベース列暗号化の例をご参照ください。
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/aliyun/alibabacloud-encdb-mysql-go-client"
)
func main() {
// ホスト名、ポート、データベースインスタンス名(dbname)、ユーザー名、パスワードなどの以下の接続情報は、インスタンス情報に更新する必要があります。
db, err := sql.Open("encmysql", "sddp_02:He******4@tcp(polar***.rwlb.rds.aliyuncs.com:3306)/sddp_test?MEK=00112233445566778899aabbccddeeff")
if err != nil {
panic(err)
}
rows, err := db.Query("SELECT * FROM user3 LIMIT 3")
if err != nil {
log.Fatalf("データのクエリに失敗しました: %v", err)
}
// 使用後は必ず結果セットを閉じる
defer rows.Close()
// 各行のデータを格納する変数を定義する
var id int
var name string
var password string
var age int
// 各行のデータをトラバースする
for rows.Next() {
// 現在の行のデータを変数にスキャンする
err := rows.Scan(&id, &name, &password, &age)
if err != nil {
log.Fatalf("行のスキャンに失敗しました: %v", err)
}
// 現在の行のデータを出力する
fmt.Printf("read data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
}
}上記のコードを実行すると、以下のような復号化された結果が得られます。
