golang md5计算

消息摘要算法(message degist)

md5是经典的“消息摘要”算法之一,也就是生成一段文本的一个 hash 值,位数固定 128 位(16个字节)。消息摘要算法的几个特点:

  1. 单向不可逆:根据文本很容易计算hash值,但是根据hash值很难反推出文本;
  2. 反碰撞:给出既定的hash值,很难找到一段文本也是同一个hash值;

golang 计算 md5 方法甚是简单,可以看下面的 demo:

  1. package main
  2.  
  3. import (
  4.         "crypto/md5"
  5.         "fmt"
  6. )
  7.  
  8. // md5:
  9. // func New() hash.Hash
  10. // func Sum(data []byte) [Size]byte
  11. func main() {
  12.         var s []byte
  13.         fmt.Scanln(&s)
  14.         fmt.Printf("%x\n", md5.Sum(s)) //
  15.  
  16.         hash := md5.New()
  17.         hash.Write(s)
  18.         fmt.Printf("%x\n", hash.Sum(nil))
  19. }

上面用了两种方式计算 md5 的值,一种是通过 New() 方法,一种是直接 Sum() 方法,前者的好处是可以不断的 write 数据,后者是一个固定的 []byte 。

mac/linux 下可以用 md5 -s "abcd" 的方式验证程序的计算结果。

消息摘要算法除了 md5 之外,还有 sha1、sha256、sha512 等多种类型。近些年 md5/sha1 找到了快速碰撞的方法,所以现在更推荐使用 sha256/sha512 算法。golang 的 sha1/sha256/sha512 使用方法和 md5 的类似,就不赘述了。

消息认证码算法(hmac)

hmac 算法是带 key 的 hash 算法。

  1. // CheckMAC reports whether messageMAC is a valid HMAC tag for message.
  2. func CheckMAC(message, messageMAC, key []byte) bool {
  3.         mac := hmac.New(sha256.New, key)
  4.         mac.Write(message)
  5.         expectedMAC := mac.Sum(nil)
  6.         return hmac.Equal(messageMAC, expectedMAC)
  7. }

上面的思路也很简单,用 sha256 hash算法 + key 得到 hmac hash 算法,然后计算 message 的 hash 值与获得的 messageMac 进行 equal 比较,相等则校验通过,否则不通过。

Tags: 

Article type: