在Golang中使用HMAC对信息进行签名并使用秘密验证完整性

959 阅读1分钟

在这个例子中,我们将用我们的密匙签署一个信息,创建一个[HMAC](en.wikipedia.org/wiki/HMAC#:… Message Authentication Code)哈希值,并把它交给客户端。然后,客户端通过用相同的秘密重新计算其签名/哈希值来验证信息的完整性,看它是否真的来自你。该秘密在客户端和服务器应用程序之间共享。如果你给了一个与原始信息不同的信息或哈希值,通信将被视为被篡改。

例子

package message

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

func Sign(msg, key []byte) string {
	mac := hmac.New(sha256.New, key)
	mac.Write(msg)

	return hex.EncodeToString(mac.Sum(nil))
}

func Verify(msg, key []byte, hash string) (bool, error) {
	sig, err := hex.DecodeString(hash)
	if err != nil {
		return false, err
	}

	mac := hmac.New(sha256.New, key)
	mac.Write(msg)

	return hmac.Equal(sig, mac.Sum(nil)), nil
}
package main

import (
	"fmt"
	"message"
)

func main() {
	msg := []byte("hello")
	key := []byte("some-secret-key")

	hash := message.Sign(msg, key)
	fmt.Println("HASH:", hash)

	if ok, err := message.Verify(msg, key, hash); !ok {
		fmt.Println("Tampered")
		if err != nil {
			fmt.Println("Error:", err)
		}
	} else {
		fmt.Println("OK")
	}
}

测试

// SUCCESS

HASH: be52bab9c7fd1ff2cbb9636da28acfe1f5cc25f12ab49d8f69163dcd9f455907
OK

// FAILURE
// If you give a different message or hash as opposed to original one
HASH: be52bab9c7fd1ff2cbb9636da28acfe1f5cc25f12ab49d8f69163dcd9f455907
Tampered