本文由簡體中文內容自動轉碼而成。阿里雲不保證此自動轉碼的準確性、完整性及時效性。本文内容請以簡體中文版本為準。

GoLang驅動

更新時間:2024-06-18 23:30
重要

本文中含有需要您注意的重要提示訊息,忽略該訊息可能對您的業務造成影響,請務必仔細閱讀。

如果您希望使用全密態功能對資料庫表中的被保護資料列進行加密,並且使用Go應用程式訪問資料庫,可以使用全密態用戶端驅動程式alibabacloud-encdb-mysql-go-client接入全密態資料庫,接入操作便捷,能夠降低使用全密態功能的成本。本文介紹如何通過alibabacloud-encdb-mysql-go-client訪問全密態資料庫。

在持有使用者密鑰的情況下,alibabacloud-encdb-mysql-go-client能夠自動完成密文資料的解密並返回明文資料,過程對應用透明,應用程式只需配置幾行代碼就可以接入全密態資料庫,降低了使用全密態功能的成本。

前提條件

  • 已開通全密態功能,詳情請參見開通全密態功能

  • 已擷取加密資料庫的串連資訊,如網域名稱(host)、連接埠(port)、資料庫執行個體名(dbname)、使用者名稱(username)、密碼(password)等。

  • 已配置資料保護規則。具體操作請參見配置資料保護規則

注意事項

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

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

操作步驟

步驟一:擷取驅動程式

go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latest
說明

步驟二:通過全密態用戶端查詢

  • URL配置

    GoLang MySQL Driver的使用方式和alibabacloud-encdb-mysql-go-client基本一致,但需要預先在alibabacloud-encdb-mysql-go-client中配置MEK(主要金鑰)和ENC_ALGO(密碼編譯演算法)參數。我們支援在URL連結中嵌入參數,準備網域名稱(hostname)、連接埠(port)、資料庫執行個體名(dbname)、使用者名稱(username)、密碼(password)等串連資訊後發起查詢:

    mek := ...
    encAlgo := ...
    
    db, err := sql.Open("encmysql", "<username>:<password>@tcp(<hostname>:<port>)/<dbname>?MEK=<mek>&ENC_Algo=<encAlgo>")
    if err != nil {
     panic(err)
    }
    說明
    • URL配置方式中,多個參數可以使用&進行拼接。

    • MEK均在用戶端本地進行處理,並以安全方式(信封加密)分發到服務端,始終保證MEK不泄露。

    MEKencAlgo的含義及取值樣本如下:

    參數

    取值樣本(字串類型)

    說明

    參數

    取值樣本(字串類型)

    說明

    MEK

    00112233445566778899aabbccddeeff

    使用者主要金鑰,由使用者自訂指定。

    常見的產生方法有:密碼產生工具(如openssl, openssl rand -hex 16)、程式設計語言中的random函數、或者從第三方Key Management Service(KMS)擷取。

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

    警告

    使用者主要金鑰是您訪問加密資料的根憑據,出於安全考慮,全密態資料庫不持有並管理您的主要金鑰,也不提供使用者主要金鑰的產生和備份服務,您需要自行產生使用者主要金鑰。一旦您丟失密鑰,將無法再訪問已有的資料。因此我們建議您妥善備份使用者主要金鑰。

    ENC_ALGO

    SM4_128_CBC

    指明被保護資料將要使用的密碼編譯演算法。

    取值範圍:

    • 國際演算法:

      • AES_128_GCM

      • AES_128_CTR

      • AES_128_CBC

      • AES_128_ECB(不推薦)

    • 國密演算法:

      • SM4_128_GCM(預設)

      • SM4_128_CTR

      • SM4_128_CBC

      • SM4_128_ECB(不推薦)

    說明
    • AES_128_ECB和SM4_128_ECB密碼編譯演算法安全性較弱,請謹慎使用,推薦適用其他安全性更高的密碼編譯演算法。

    • 可選,預設為SM4_128_GCM。

  • 完整程式碼範例

    本文以建立demo專案(go mod init demo)為例用於程式碼範例。

    package main
    
    import (
     "database/sql"
     "fmt"
     _ "github.com/aliyun/alibabacloud-encdb-mysql-go-client"
    )
    
    func main() {
     // 以下網域名稱(hostname)、連接埠(port)、資料庫執行個體名(dbname)、使用者名稱(username)、密碼(password)等串連資訊需要更新為您的執行個體資訊
     
     db, err := sql.Open("encmysql", "<username>:<password>@tcp(<hostname>:<port>)/<dbname>?MEK=00112233445566778899aabbccddeeff&ENC_ALGO=SM4_128_CBC")
     if err != nil {
     panic(err)
     }
     _, err = db.Exec("DROP TABLE IF EXISTS test")
     if err != nil {
     panic(err)
     }
     _, err = db.Exec(`create table test(a int, b text, c float)`)
     if err != nil {
     panic(err)
     }
     _, err = db.Exec(`insert into test set a = 0, b = 'test', c = 0.0`)
     if err != nil {
     panic(err)
     }
     rows, err := db.Query("SELECT * FROM test")
     rows.Next()
     var a int
     var b string
     var c float32
    
     err = rows.Scan(&a, &b, &c)
     fmt.Printf("read data: %d %s %f\n", a, b, c)
    }

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

    read data: 0 test 0.000000

相關文檔

  • 本頁導讀 (1, M)
  • 前提條件
  • 注意事項
  • 操作步驟
  • 步驟一:擷取驅動程式
  • 步驟二:通過全密態用戶端查詢
  • 相關文檔
文檔反饋
phone 聯絡我們

立即和Alibaba Cloud在線服務人員進行交談,獲取您想了解的產品信息以及最新折扣。

alicare alicarealicarealicare