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.消息认证码存在的问题

弊端:

  • 共享秘钥分发困难问题(可以用非对称解决)

无法解决的问题

  • 无法通过第三方证明
  • 不能防止否认

Yuan_sr
18 声望6 粉丝

引用和评论

0 条评论