密码技术--消息认证码及Go语言应用

240 阅读1分钟

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

弊端:

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

无法解决的问题

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