Metode 標準対称暗号化署名パッド Golang を実装する

PHPz
リリース: 2024-07-18 20:37:52
オリジナル
635 人が閲覧しました

Image description

標準対称暗号化署名方式とは何ですか?

この方法は、データを安全に暗号化し、復号化キーを持たない人には読み取れないようにする方法です。皆さん、想像してみてください。南京錠でロックした日記があるとします。鍵を持っている人だけがあなたの日記を開いて読むことができます。

対称暗号化

対称暗号化は友達と友達のようなものです。何これ、ハハハ、要は、ロックを開けるために同じ鍵を持っているようなものです。このキーは、データの暗号化 (ロック) と復号化 (ロック解除) に使用されます。そのため、あなたがキーを持っている限り、友達も友達も同じデータをロックしたりロック解除したりできます。

サイン

ここでの署名は物理的な署名ではなく、デジタル署名に近いものです。この署名により、送信されたデータが本当に友人からのものであり、誰もデータを途中で変更していないことが保証されます。したがって、皆さん、受け取ったデータはソースからの本物であり、改ざんされていないことを確信できます。

なぜこの方法を使用する必要があるのでしょうか?

  • データ セキュリティ: データを悪意のある手から守りたいと思いますよね?対称暗号化を使用すると、データは暗号化され、キーを持っている人だけが開くことができます。
  • データの整合性: 署名を使用すると、送受信するデータが本物であり、改ざんされていないことを確認できます。したがって、友人の皆さん、誰かが不正行為をしているのではないかと心配する必要はありません。
  • 効率: 対称暗号化は、暗号化と復号化のプロセスが単純であるため、通常、非対称暗号化より高速です。

Golangでの使用例

次に、Golang でこのメソッドを使用する方法を見てみましょう。

Golang の対称暗号化

package main

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

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

    ciphertext := make([]byte, aes.BlockSize+len(text))
    iv := ciphertext[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return "", err
    }

    stream := cipher.NewCFBEncrypter(block, iv)
    stream.XORKeyStream(ciphertext[aes.BlockSize:], text)

    return fmt.Sprintf("%x", ciphertext), nil
}

func decrypt(key []byte, cryptoText string) (string, error) {
    ciphertext, _ := hex.DecodeString(cryptoText)

    block, err := aes.NewCipher(key)
    if err != nil {
        return "", err
    }

    if len(ciphertext) < aes.BlockSize {
        return "", fmt.Errorf("ciphertext too short")
    }
    iv := ciphertext[:aes.BlockSize]
    ciphertext = ciphertext[aes.BlockSize:]

    stream := cipher.NewCFBDecrypter(block, iv)
    stream.XORKeyStream(ciphertext, ciphertext)

    return string(ciphertext), nil
}

func main() {
    key := []byte("the-key-has-to-be-32-bytes-long!")
    plaintext := "hello, world!"

    ciphertext, err := encrypt(key, []byte(plaintext))
    if err != nil {
        fmt.Println("Error encrypting:", err)
        return
    }
    fmt.Printf("Encrypted: %s\n", ciphertext)

    decryptedText, err := decrypt(key, ciphertext)
    if err != nil {
        fmt.Println("Error decrypting:", err)
        return
    }
    fmt.Printf("Decrypted: %s\n", decryptedText)
}

ログイン後にコピー

署名 Golang

package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
    "fmt"
)

func createHMAC(key, message []byte) string {
    mac := hmac.New(sha256.New, key)
    mac.Write(message)
    return hex.EncodeToString(mac.Sum(nil))
}

func verifyHMAC(key, message []byte, signature string) bool {
    expectedMAC := createHMAC(key, message)
    return hmac.Equal([]byte(expectedMAC), []byte(signature))
}

func main() {
    key := []byte("my-secret-key")
    message := []byte("important message")

    signature := createHMAC(key, message)
    fmt.Printf("Signature: %s\n", signature)

    isValid := verifyHMAC(key, message, signature)
    fmt.Printf("Is valid: %t\n", isValid)
}

ログイン後にコピー

したがって、標準対称暗号化署名方式は、データのセキュリティと整合性を維持するために重要です。対称暗号化を使用すると、データを暗号化して安全にすることができ、署名を使用すると、送受信するデータが本物であり、改ざんされていないことを保証できます。したがって、友人が高度なセキュリティを必要とするあらゆる種類のニーズにこの方法を使用するようにしてください。

出典:

  • HMAC Go
  • SHA256

以上がMetode 標準対称暗号化署名パッド Golang を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート