密码学:三.消息认证码MAC
在信息的传输中我们不但要保证信息加密还要保证信息的:完整性,正式性,不可抵赖性。
消息摘要(MD)
消息摘要函数时一种用于判断数据完整性的算法,也称为散列函数或哈希函数,函数的返回值就散列值,散列值又称为消息摘要或者指纹。
常见算法:MD5 SHA
消息认证码(Message Authentication Code,简称MAC)
在消息摘要的基础上加了秘钥,消息验证码一般和对称加密配合使用。
- 发送方和接收方事先共享同一个密钥。
- 发送方将发送消息和密钥进行MAC运算,得到MAC值,并把MAC值与消息一同发送给接收方。
- 接收方接收到消息后,将消息部分与事先共享的密钥进行MAC运算,得到MAC值,将MAC值与发送方发送的MAC值进行比较,如果一致,证明消息的真实性和完整性
代码实践
golang
func getSign(data map[string]string, key string) string {
keys := make([]string, 0)
for k, _ := range data {
keys = append(keys, k)
}
sort.Strings(keys)
for _,v := range keys{
key += v + data[v]
}
h := md5.New()
h.Write([]byte(key))
return hex.EncodeToString(h.Sum(nil))
}
接收方虽然可以确定消息的完整性和真实性,解决篡改和伪造消息的问题,但不能防止A否认发送过消息。A给B发送了消息,B接收到之后,A否认自己发送过消息给B,并抵赖说,“虽然我和B都能计算处正确的MAC值,但是可能是B的密钥被攻击者盗取了,攻击者给B发的消息。”
MD(消息摘要)、MAC(消息认证码)、数字签名的区别:
目标\方法 | MD | MAC | 数字签名 |
---|---|---|---|
完整性 | 是 | 是 | 是 |
真实性 | 否 | 是 | 是 |
防抵赖 | 否 | 否 | 是 |
数字签名一般和非对称加密配合使用,后续归纳总结。 |