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
}

重要函数说明

  1. 创建一个底层采用哈希算法的 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)
}

重要函数说明:

  1. 比较两个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("消息认证码认证失败 ......")
    }
}

6.3 消息认证码的密钥配送问题

6.4 消息认证码无法解决的问题

6.4.1 对第三方证明

6.4.2 防止否认

6.5 总结

12-24 15:13