1.什么是消息认证码
消息认证码(message authorization code)是一种确认完整性并进行认证的技术,取了三个单词的首字母,简称为MAC
发送者:((原始数据) + 秘钥) * 哈希函数 = 散列值(消息认证码)
- 发送原始数据和消息认证码
接收者:
- 接收消息认证码和原始数据
(接收原始数据 + 秘钥) * 哈希函数 = 新的散列值 =? 接收到的散列值(消息认证码)
秘钥必须一样,使用的哈希函数必须一致
#### 2.go中使用消息认证码
package main
import (
"crypto/hmac"
"crypto/sha256"
)
func GenerateHamc(plainText, key []byte) []byte {
//1.初始化一个哈希接口,指定使用的哈希算法和秘钥
hMAC := hmac.New(sha256.New, key)
//2.添加数据
hMAC.Write(plainText)
//3.计算
sum := hMAC.Sum(nil)
return sum
}
func VerityHmac(plainText, key, hMACOld []byte) bool {
//1.初始化一个哈希接口,指定使用的哈希算法和秘钥
hMAC := hmac.New(sha256.New, key)
//2.添加原始数据
hMAC.Write(plainText)
//3.计算散列值
hMacNew := hMAC.Sum(nil)
//4.比较消息认证码
res := hmac.Equal(hMacNew, hMACOld)
return res
}
func main() {
src := []byte("消息认证码(message authorization code)是一种确认完整性并进行认证的技术,取了三个单词的首字母,简称为MAC")
key := []byte("12345678")
hMacOld := GenerateHamc(src, key)
res := VerityHmac(src, key, hMacOld)
fmt.Printf("消息认证结果:%t\n", res)
}
3.消息认证码存在的问题
弊端:
- 共享秘钥分发困难问题(可以用非对称解决)
无法解决的问题
- 无法通过第三方证明
- 不能防止否认
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。