GO实现HMAC消息认证码
消息认证码用于对发送者进行身份认证保证数据未被篡改。
详见 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)
}