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

Data Security Center:Go ドライバ

最終更新日:Mar 25, 2025

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@latest

2. 構成する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)
    }
}

上記のコードを実行すると、以下のような復号化された結果が得られます。

image