全部產品
Search
文件中心

Data Security Center:GoLang驅動

更新時間:Sep 12, 2025

配置RDS MySQL版或PolarDB MySQL版資料庫表中敏感性資料列加密後,如果希望通過GO應用訪問這些加密列的明文,可使用alibabacloud-encdb-mysql-go-client驅動串連資料庫。本文介紹如何使用alibabacloud-encdb-mysql-go-client串連資料庫並訪問加密列的明文資料。

背景資訊

列加密功能允許使用者對資料庫中的特定列進行加密儲存,從而提高資料的安全性。加密後的資料在資料庫中以密文形式儲存,但通過授權的用戶端可以透明地解密並訪問明文資料。

阿里雲提供了Go語言的全密態用戶端驅動程式alibabacloud-encdb-mysql-go-client。使用者只需在用戶端側使用該驅動串連資料庫,並在資料庫連接URL中指定主要金鑰(Master Encryption Key,簡稱MEK),即可訪問加密資料庫。該驅動會自動完成密文資料的解密返回明文資料。

MEK:由用戶端通過安全的非對稱式加密協議傳輸給資料庫服務端,使服務端、用戶端具有相同的密鑰,從而通過對稱式加密安全傳輸資料。

取值範圍:長度為16位元組的16進位字串,且長度為32個字元。

警告

MEK是您授權用戶端訪問加密資料的根憑據。出於安全考慮,加密資料庫不持有並管理您的MEK,也不提供MEK的產生和備份服務,您需要自行產生MEK。MEK的儲存和管理對資料庫的安全性非常重要。因此我們建議您妥善備份MEK。

前提條件

  • 已為目標資料庫配置列加密能力,並設定目標資料庫帳號的密文許可權為密文許可權(JDBC解密)。設定資料庫列加密的具體操作和帳號許可權的詳細說明,請參見設定資料庫列加密

  • 已擷取加密資料庫串連資訊:串連地址、連接埠、資料庫名稱、資料庫帳號、密碼。

注意事項

  • 請妥善儲存您設定的主要金鑰MEK

  • Go版本需要在1.18及以上。

用戶端接入說明

1. 擷取驅動程式

alibabacloud-encdb-mysql-go-client全面相容社區版的GoLang MySQL Driver,支援標準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不泄露。

範例程式碼:

// 以下串連地址(hostname)、連接埠(port)、資料庫執行個體名(dbname)、使用者名稱(username)、密碼(password)等串連資訊需要更新為您的執行個體資訊 
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("Failed to query data: %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("Failed to scan row: %v", err)
    }

    // 輸出當前行的資料
    fmt.Printf("read data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
}

完整程式碼範例

例如使用具備密文許可權(JDBC解密)的資料庫帳號查詢某PolarDB MySQL資料庫中加密列的明文資料。

以下樣本中資料庫配置的相關資訊,請參見列加密中的PolarDB MySQL資料庫列加密樣本

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/aliyun/alibabacloud-encdb-mysql-go-client"
)

func main() {
    // 以下串連地址(hostname)、連接埠(port)、資料庫執行個體名(dbname)、使用者名稱(username)、密碼(password)等串連資訊需要更新為您的執行個體資訊

    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("Failed to query data: %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("Failed to scan row: %v", err)
        }

        // 輸出當前行的資料
        fmt.Printf("read data: id=%d, name=%s, password=%s, age=%d\n", id, name, password, age)
    }
}

調用上述代碼後,系統會返回類似如下解密後的結果:

image