ホームページ  >  記事  >  データベース  >  MySQL データベースと Go 言語: データの内部暗号化を確実に行うには?

MySQL データベースと Go 言語: データの内部暗号化を確実に行うには?

WBOY
WBOYオリジナル
2023-06-17 15:00:041566ブラウズ

インターネット技術の継続的な発展に伴い、データセキュリティは非常に重要なテーマとなっています。データベース運用では、データのセキュリティと機密性を確保することが非常に重要です。 MySQL は一般的なデータベースであるため、セキュリティ設定機能が弱いものの、何らかの技術的手段により内部データの暗号化を確実に行うことができ、Go 言語はデータ暗号化に非常に適した言語です。次に、MySQL データベースと Go 言語が内部データの暗号化をどのように保証するかについて説明します。

1. MySQL データの暗号化

1.1 パスワードの暗号化

MySQL データベースでは、デフォルトでユーザーのログイン パスワードがクリア テキストで保存されるため、非常に簡単に盗まれます。ハッカーによって。これを防ぐには、パスワードを暗号化する必要があります。

MySQL は、MD5、SHA などのさまざまな暗号化方式を提供します。その中でもSHA-2は比較的強力な暗号化方式とされています。 SHA-2 でユーザーのパスワードを暗号化し、データベースに保存すると、ユーザーのパスワードのセキュリティを効果的に向上させることができます。

MySQL の PASSWORD 関数を使用して、以下に示すように SHA-2 暗号化を実行できます。

UPDATE users SET password=PASSWORD('123456') WHERE name='zhangsan';

1.2 データベース暗号化

パスワード暗号化に加えて、全体データベースは暗号化されています。 MySQL は、データベースのパフォーマンスに影響を与えることなく、保存されたデータのセキュリティを確保できる暗号化方式である Transparent Data Encryption (TDE) を提供します。

TDE は、「Advanced Encryption Standard (AES)」と呼ばれる暗号化アルゴリズムを使用してデータベース全体を暗号化し、ハッカーによるデータベース侵入やデータ盗難のリスクを効果的に防ぎます。

TDE 暗号化は、次の手順で実現できます。

  1. MySQL インストール ディレクトリの my.cnf ファイルに次の 2 行を追加します。
[mysqld]
plugin-load-add=innodb_engine.so
  1. MySQL コマンド ラインで次の SQL ステートメントを実行します:
INSTALL PLUGIN INNODB_TRX; 
INSTALL PLUGIN INNODB_LOCKS; 
INSTALL PLUGIN INNODB_LOCK_WAITS; 
INSTALL PLUGIN INNODB_CMP; 
INSTALL PLUGIN INNODB_CMP_RESET; 
INSTALL PLUGIN INNODB_CMPMEM; 
INSTALL PLUGIN INNODB_CMPMEM_RESET; 
SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_file_format=Barracuda;
  1. 既存のテーブルを暗号化します:
ALTER TABLE table_name ENCRYPTION='Y';

2. Go 言語のデータ暗号化

2.1 対称暗号化

対称暗号化は一般的な暗号化方式です。暗号化と復号化に同じキーを使用します。暗号化と復号化のプロセス中、キーは一貫性を保つ必要があります。 crypto パッケージは、対称暗号化を実装するために Go 言語で使用されます。一般的に使用される暗号化アルゴリズムには、AES、DES、Blowfish などが含まれます。

次は、AES 対称暗号化の使用例です。

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/base64"
    "fmt"
    "io"
)

func encrypt(key []byte, text string) (string, error) {
    // Create the AES cipher
    cipherBlock, err := aes.NewCipher(key)
    if err != nil {
        return "", err
    }

    // Create a new IV with random data
    iv := make([]byte, aes.BlockSize)
    if _, err = io.ReadFull(rand.Reader, iv); err != nil {
        return "", err
    }

    // Create a new Cipher Block Chaining (CBC) mode encrypter
    encrypter := cipher.NewCBCEncrypter(cipherBlock, iv)

    // Encrypt the text
    plaintext := []byte(text)
    ciphertext := make([]byte, len(plaintext))
    encrypter.CryptBlocks(ciphertext, plaintext)

    // Base64 encode the IV and ciphertext
    result := base64.StdEncoding.EncodeToString(iv)
    result += ":"
    result += base64.StdEncoding.EncodeToString(ciphertext)
    return result, nil
}

func decrypt(key []byte, text string) (string, error) {
    // Split the data into IV and ciphertext
    parts := strings.Split(text, ":")
    if len(parts) != 2 {
        return "", fmt.Errorf("invalid encrypted text format")
    }

    // Base64 decode the IV and ciphertext
    iv, err := base64.StdEncoding.DecodeString(parts[0])
    if err != nil {
        return "", err
    }
    ciphertext, err := base64.StdEncoding.DecodeString(parts[1])
    if err != nil {
        return "", err
    }

    // Create the AES cipher
    cipherBlock, err := aes.NewCipher(key)
    if err != nil {
        return "", err
    }

    // Create a new Cipher Block Chaining (CBC) mode decrypter
    decrypter := cipher.NewCBCDecrypter(cipherBlock, iv)

    // Decrypt the ciphertext
    plaintext := make([]byte, len(ciphertext))
    decrypter.CryptBlocks(plaintext, ciphertext)

    return string(plaintext), nil
}

func main() {
    key := []byte("thisisasamplekey")
    encryptedText, err := encrypt(key, "Hello World!")
    if err != nil {
        panic(err)
    }
    fmt.Println("Encrypted Text:", encryptedText)

    decryptedText, err := decrypt(key, encryptedText)
    if err != nil {
        panic(err)
    }
    fmt.Println("Decrypted Text:", decryptedText)
}

2.2 非対称暗号化

非対称暗号化では、暗号化と復号化に 1 組のキーが使用されます。そのうちの 1 つは 1 つのキーです。 1 つは公開されており公開キーと呼ばれ、もう 1 つのキーは秘密であり秘密キーと呼ばれます。 crypto/rsa パッケージは Go 言語で非対称暗号化を実装するために使用されます。非対称暗号化アルゴリズムは対称暗号化アルゴリズムよりも安全ですが、速度が遅いため、一般に少量のデータを暗号化するために使用されるか、対称暗号化アルゴリズムと組み合わせて使用​​されます。暗号化。

以下は RSA 非対称暗号化の使用例です:

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/sha256"
    "encoding/hex"
    "fmt"
)

func generateRSAKeys() (*rsa.PrivateKey, *rsa.PublicKey, error) {
    privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        return nil, nil, err
    }

    return privateKey, &privateKey.PublicKey, nil
}

func encrypt(message string, publicKey *rsa.PublicKey) (string, error) {
    hashed := sha256.Sum256([]byte(message))

    ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, hashed[:])
    if err != nil {
        return "", err
    }

    return hex.EncodeToString(ciphertext), nil
}

func decrypt(ciphertext string, privateKey *rsa.PrivateKey) (string, error) {
    data, err := hex.DecodeString(ciphertext)
    if err != nil {
        return "", err
    }

    hash := make([]byte, len(data))
    err = rsa.DecryptPKCS1v15(rand.Reader, privateKey, data, hash)
    if err != nil {
        return "", err
    }

    return string(hash), nil
}

func main() {
    privateKey, publicKey, err := generateRSAKeys()
    if err != nil {
        panic(err)
    }

    encryptedText, err := encrypt("Hello World!", publicKey)
    if err != nil {
        panic(err)
    }
    fmt.Println("Encrypted Text:", encryptedText)

    decryptedText, err := decrypt(encryptedText, privateKey)
    if err != nil {
        panic(err)
    }
    fmt.Println("Decrypted Text:", decryptedText)
}

3. 概要

MySQL データベースと Go 言語はどちらも、データ暗号化において異なるソリューションを提供します。 MySQL のデータ保護にはパスワード暗号化とデータベース暗号化が使用でき、Go 言語のデータ暗号化には対称暗号化と非対称暗号化が使用できます。必要に応じて、さまざまなソリューションを組み合わせて、より強力なデータ保護効果を実現できます。

以上がMySQL データベースと Go 言語: データの内部暗号化を確実に行うには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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