ホームページ  >  記事  >  データベース  >  Go言語を使用してMySQLデータベースのデータフィールドを暗号化する方法

Go言語を使用してMySQLデータベースのデータフィールドを暗号化する方法

王林
王林オリジナル
2023-06-17 18:34:331718ブラウズ

データベースのセキュリティ問題がますます顕著になるにつれて、データの暗号化が必要な手段となっています。 Go 言語の効率性とシンプルさは、特に Web 開発の分野で多くの注目を集めています。この記事では、Go言語を使用してMySQLデータベースのデータフィールドの暗号化処理を実装する方法を紹介します。

1. MySQL データベース フィールド暗号化の重要性

現代の情報化時代において、データベース システムはますます重要になっています。しかし、脅威の増大により、データベースのセキュリティが企業や組織にとって大きな課題となっています。いくつかの調査では、データベース攻撃とデータ侵害がビジネスに対する最大のセキュリティ リスクの 1 つになっていることが示されています。したがって、データ暗号化は、この問題を解決するために必要な方法の 1 つになりました。

データベース フィールド暗号化の重要性は、ハッカー攻撃やデータ漏洩を防ぐために、ユーザー名、電話番号、電子メール アドレス、パスワードなどのデータベース内の機密情報を保護することです。この機密データを暗号化することで、ハッカーはデータ取得時のデータ トラバースや情報盗難を防ぐことができます。

2. Go 言語を使用して MySQL データベースのデータ フィールド暗号化を実装する方法

Go 言語は、Web 開発で広く使用されている、効率的で軽量なコンパイル済みのオープン ソース プログラミング言語です。 Go 言語のライブラリを使用して、MySQL データベースのデータ フィールドを暗号化および復号化できます。ここではGo言語のGORMライブラリを使用します。

GORM は優れた Go 言語 ORM ライブラリであり、コードファーストのデータベース アクセスを提供し、MySQL、SQLite、PostgreSQL、SQL Server などのさまざまなデータベースをサポートします。 GORM ライブラリを使用すると、MySQL データベースの暗号化を簡単に実装できます。

  1. 依存関係パッケージのインポート

Go 言語の開発環境を開き、使用する必要がある依存関係パッケージをインポートします:

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)
  1. データベース接続

GORM の Open 関数を使用してデータベースに接続します。コードは次のとおりです:

dsn := "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  1. 暗号化キーと復号化キーを記録します

この例では、AES 暗号化および復号化メカニズムが使用されます。後で使用できるように、暗号化キーと復号化キーをコードに記録する必要があります。コードは次のとおりです:

var key = []byte("the-key-has-to-be-32-bytes-long!")
  1. 暗号化関数と復号化関数を定義する

定義する必要があります。ここでは、暗号化および復号化機能、AES 暗号化および CBC 暗号化モードが使用されます。暗号化関数のコードは次のとおりです。

func encrypt(data []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

    plaintext := padData(data)

    // The IV needs to be unique, but not secure. Therefore it's common to
    // include it at the beginning of the ciphertext.
    ciphertext := make([]byte, aes.BlockSize+len(plaintext))
    iv := ciphertext[:aes.BlockSize]
    if _, err := rand.Read(iv); err != nil {
        return nil, err
    }

    mode := cipher.NewCBCEncrypter(block, iv)
    mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)

    return []byte(base64.StdEncoding.EncodeToString(ciphertext)), nil
}

復号化関数のコードは次のとおりです。

func decrypt(data []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

    ciphertext, err := base64.StdEncoding.DecodeString(string(data))
    if err != nil {
        return nil, err
    }

    if len(ciphertext) < aes.BlockSize {
        return nil, fmt.Errorf("ciphertext too short")
    }

    iv := ciphertext[:aes.BlockSize]
    ciphertext = ciphertext[aes.BlockSize:]

    // CBC mode always works in whole blocks.
    if len(ciphertext)%aes.BlockSize != 0 {
        return nil, fmt.Errorf("ciphertext is not a multiple of the block size")
    }

    mode := cipher.NewCBCDecrypter(block, iv)
    mode.CryptBlocks(ciphertext, ciphertext)

    return unpadData(ciphertext), nil
}
  1. 例: MySQL データベースに暗号化されたフィールドを追加します

完全な例を 1 つ見てみましょう。 MySQL データベースのテーブルに暗号化されたフィールドを追加するとします。次のようにモデル コードを記述します。

type User struct {
    ID      uint
    Name    string
    Email   string
    Passwd  []byte `gorm:"column:passwd"`
}

次に、モデル内のテーブル名と暗号化フィールドの書き込みメソッドと読み取りメソッドを書き換えます。コードは次のとおりです。

func (u *User) TableName() string {
    return "users"
}

func (u *User) BeforeSave(tx *gorm.DB) (err error) {
    pData, err := encrypt(u.Passwd)
    if err != nil {
        return
    }

    u.Passwd = pData
    return
}

func (u *User) AfterFind(tx *gorm.DB) (err error) {
    pData, err := decrypt(u.Passwd)
    if err != nil {
        return
    }

    u.Passwd = pData
    return
}

In the BeforeSave( ) メソッド、追加 ユーザーのパスワードは暗号化されて保存されます。 AfterFind() メソッドで、保存されている暗号化されたパスワードを復号して返します。このようにして、暗号化されたパスワード フィールドを MySQL データベースに保存できます。

  1. 例: MySQL データベースの暗号化フィールドをクエリする

テーブルで暗号化フィールドを使用する場合、クエリ中にデータを復号化する必要があります。 AfterFind フックを使用すると、クエリ結果の暗号化されたフィールドを自動的に復号化できます。サンプル コードは次のとおりです。

users := []User{}
result := db.Find(&users)

if result.Error != nil {
    panic(result.Error)
}

for _, user := range users {
    fmt.Println(user)
}

上の例では、すべてのユーザー レコードをクエリし、返された結果をコンソールに出力します。 Find() 関数を呼び出すと、GORM は自動的に AfterFind() メソッドを実行して結果を復号化します。

3. 概要

この記事では、Go 言語と GORM ライブラリを使用して MySQL データベースにフィールド暗号化を実装する方法を紹介します。主な手順には、データベースへの接続、暗号化の定義、および復号化関数、および暗号化されたフィールドをテーブルに書き込み、データをクエリするときの復号化操作。これらの操作により、MySQL データベース内の機密情報を簡単に暗号化して保護できます。

以上がGo言語を使用してMySQLデータベースのデータフィールドを暗号化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。