消息认证码用于对发送者进行身份认证保证数据未被篡改。

详见 http://www.okweex.com/3128.html

消息认证存在的问题
1. 无法有效的配送秘钥
2. 无法进行第三方证明
3. 无法防止发送方否认
解决办法:非对称加密数字签名!!

package main

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

//本案例使用src为明文演示,在实际项目中应改为加密后到的密文

//生成hmac (消息认证码)
func generateHMAC(src,key []byte) []byte {
	//创建哈希器
	hasher := hmac.New(sha256.New,key)
	hasher.Write(src)

	//生成mac值
	mac := hasher.Sum(nil)

	return mac
}

//认证MAC 接受到MAC1与密文
func verifyHMAC(src,mac1,key []byte) bool {
	//转换成hmac
	mac2 := generateHMAC(src,key)

	//对比mac1与mac2
	return hmac.Equal(mac1,mac2)
}

func main()  {
	src := []byte("hello world")
	key := []byte("123456")

	hmac1 := generateHMAC(src,key)

	fmt.Printf("HMAC1:%x\n",hmac1)

	check1 := verifyHMAC(src,hmac1,key)
	fmt.Printf("认证结果1:%v\n",check1)

	//篡改消息
	srcerr := []byte("hello worldX")
	check2 := verifyHMAC(srcerr,hmac1,key)
	fmt.Printf("认证结果2:%v\n",check2)

}