[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 utilimport ("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 cursorfile.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 cursorfile.Seek(0, 0)return hex.EncodeToString(_md5.Sum(nil))}
