6. 消息认证码
"消息认证码 --- 消息被正确传送了吗?"
6.1 什么是消息认证码
Alice 和 Bob 的故事
$$
从账户A-5374 向账户B-6671汇款1000万元
$$什么是消息认证码
**单向散列函数与消息认证码的比较**
6.2 消息认证码的使用步骤
6.3 HMAC
6.3.1 HMAC介绍
**使用HMAC通过秘钥将消息生成消息认证码的内部实现**:
6.3.2 Go中对HMAC的使用
需要使用的包
import "crypto/hmac"
使用的函数
func New(h func() hash.Hash, key []byte) hash.Hash
func Equal(mac1, mac2 []byte) bool
生成消息认证码:
// 生成消息认证码
func GenerateHMAC(src, key []byte) []byte {
// 1. 创建一个底层采用sha256算法的 hash.Hash 接口
myHmac := hmac.New(sha256.New, key)
// 2. 添加测试数据
myHmac.Write(src)
// 3. 计算结果
result := myHmac.Sum(nil)
return result
}
重要函数说明
创建一个底层采用哈希算法的 hash.Hash 接口
函数对应的包: "crypto/hmac" func New(h func() hash.Hash, key []byte) hash.Hash - 参数 h: 函数指针, 返回值为hash.Hash, 可以使用哈希算法对应的New方法, 如: -- md5.New -- sha1.New -- sha256.New -- sha256.New224 -- sha512.New -- sha512.New384 - 参数 key: 和数据进行混合运算使用的秘钥 - 返回值: hash.Hash 接口
验证消息认证码
func VerifyHMAC(res, src, key []byte) bool {
// 1. 创建一个底层采用sha256算法的 hash.Hash 接口
myHmac := hmac.New(sha256.New, key)
// 2. 添加测试数据
myHmac.Write(src)
// 3. 计算结果
result := myHmac.Sum(nil)
// 4. 比较结果
return hmac.Equal(res, result)
}
重要函数说明:
比较两个MAC是否相同
函数对应的包: "crypto/hmac" func Equal(mac1, mac2 []byte) bool - 参数 mac1, mac2: 通过哈希算法计算得到的消息认证码 - 返回值: 如果mac1==mac2, 返回 true; 否则, 返回 false
测试代码
func HMacTest() {
key := []byte("我是消息认证码秘钥")
src := []byte("我是消息认证码测试数据")
result := GenerateHMAC(src, key)
final := VerifyHMAC(result, src, key)
if final {
fmt.Println("消息认证码认证成功!!!")
} else {
fmt.Println("消息认证码认证失败 ......")
}
}