[Go菜牛系列]Hash算法的使用:MD5/Sha1
在进行Web应用开发过程中,我们经常需要对数据进行加密或校对。
比如在client请求server接口时,需要传递签名参数(比如sign/token)给server,让server校验此次请求的合法性;又比如client往server端传输文件时,需要将文件的hash值传递给server, server在计算一遍接收到的文件内容的hash值后,和client上传的hash值作比对,一致的话才认为这次文件上传是完整的。
这些情况下,我们一般会用到CRC32/MD5/Sha1等等这些加密算法,其中这些算法有一个共同点, 就是都是非对称加密,也就是理论上是不可逆的。
以下是Go实现的MD5/Sha1的计算方法,可使用于文件或数据流的hash计算。
package util
import (
"io"
"os"
"crypto/md5"
"crypto/sha1"
"encoding/hex"
)
// Sha1 : 计算[]byte类型数据的sha1值
func Sha1(data []byte) string {
_sha1 := sha1.New()
_sha1.Write(data)
return hex.EncodeToString(_sha1.Sum([]byte("")))
}
// FileSha1 : 计算文件的sha1值
func FileSha1(file *os.File) string {
_sha1 := sha1.New()
io.Copy(_sha1, file)
// reset cursor
file.Seek(0, 0)
return hex.EncodeToString(_sha1.Sum(nil))
}
// MD5 : 计算[]byte类型数据的MD5值
func MD5(data []byte) string {
_md5 := md5.New()
_md5.Write(data)
return hex.EncodeToString(_md5.Sum([]byte("")))
}
// MD5 : 计算文件的MD5值
func FileMD5(file *os.File) string {
_md5 := md5.New()
io.Copy(_md5, file)
// reset cursor
file.Seek(0, 0)
return hex.EncodeToString(_md5.Sum(nil))
}