golang标准库-crypto/hmac(加密哈希算法)

hmac算法是加密的hash算法,它需要一个hash算法(比如sha256获取md5等)和一个密匙key,在hash计算的过程中将密匙key混入,产生一个和原来hash算法相同位数的hash值。
在大多数情况下,我们甚至可以将hamc算法看做是加盐的hash算法(加盐是将一个随机字符串放在需要加密的密文前面或者后面,然后对这个拼接后的密文进行加密得到hash值)。
但它们的加密原理肯定不一样,虽然达到的效果是一样的,都是对密文混入一个第三方值,然后得到一个hash值。

我们来看go的hmac包的怎么使用,看下面的方法

func New(h func() hash.Hash, key []byte) hash.Hash => 接受一个hash算法和一个密匙key

下面以sha256md5算法举例:

func main()  {

	// 对sha256算法进行hash加密,key随便设置
	hash := hmac.New(sha256.New,[]byte("abc123")) // 创建对应的sha256哈希加密算法
	hash.Write([]byte("abc123")) // 写入加密数据
	fmt.Printf("%x\n",hash.Sum(nil)) // c10a04b78bcbcc1c4cba37f6afe0fa60cbf08f6e0a1d93b09387f7069be1aeff

	// 对md5算法进行hash加密,key随便设置
	hash = hmac.New(md5.New,[]byte("abc123")) // 创建对应的md5哈希加密算法
	hash.Write([]byte("abc123")) // 写入加密数据
	fmt.Printf("%x\n",hash.Sum(nil)) // 0eee86e484505ec4ab48c18095e6a8ac
}

只要是hash函数(sha1,sha256,sha512,md5等算法,都可以hmac加密哈希算法)。

我们再来看hmac包的另一个方法:

func Equal(mac1, mac2 []byte) bool =>比较两个hash值是否相同,而不会泄露对比时间信息。(以避免时间侧信道攻击:指通过计算比较hash值花费的时间的长短来获取密码的信息,用于密码破解),这个方法只要传入的数据长短相同,那么比较的时间就是一样的,举个栗子:比较[1,2,3],[1,2,2]与[1,2,3],[3,4,5],这个方法执行的时间都是一样的,比较的时候不会因为后面一组数据第一个值不同就立即返回而使得后面一组数据的比较时间比前面一组的比较时间段。这样做是为了防止黑客用暴力破解的方式不断收集每个hash与正确hash的比较时间,从而来逐步确定正确hash的值,从而达到破解hash密文的目的。

下面是用hmac包比较密文与hash是否相同的标准操作:

func CheckMAC(msg, msgMAC, key []byte) bool {
	mac := hmac.New(sha256.New,key) // 创建hash加密算法
	mac.Write(msg) // 写入数据
	expectedMAC := mac.Sum(nil) //获取加密后的hash
	return hmac.Equal(expectedMAC,msgMAC) // 比较预期的hash和实际的hash
}

到此hmac包介绍完了

 

你可能感兴趣的:(golang标准库,go)