Go的crypto包中提供了丰富的加密工具,可以计算 MD5、SHA1、SHA256 等等,他们分别在包 crypto/md5、crypto/sha1、crypto/sha256 中。每一种算法提供的接口都大致相同,如下所示(仅列出重要部分):
// 创建一个Hash对象,用于计算相应的加密值
func New() hash.Hash
// 计算 data 的加密值,Size是一个常量,用于表示加密值的长度,MD5为16,SHA1为20
func Sum(data []byte) [Size]byte
// 在hash包中,提供了如下的Hash结构体:
type Hash interface {
// 通过内嵌 io.Writer 字段提供 io.Writer 接口
io.Writer
// 将b表示的字节切片加入当前的hash中,返回计算结果
Sum(b []byte) []byte
// ...
}
// 下面的例子中还用到了hex中的一个转换函数:
// 将src表示的16进制切片转换成字符串
func EncodeToString(src []byte) string
一个完整的例子:
package main
import (
"crypto/md5"
"crypto/sha1"
"encoding/hex"
"fmt"
"io"
"log"
"os"
)
func md5s(s string) string {
r := md5.Sum([]byte(s))
return hex.EncodeToString(r[:])
}
func md5f(fName string) string {
f, e := os.Open(fName)
if e != nil {
log.Fatal(e)
}
h := md5.New()
_, e = io.Copy(h, f)
if e != nil {
log.Fatal(e)
}
return hex.EncodeToString(h.Sum(nil))
}
func sha1s(s string) string {
r := sha1.Sum([]byte(s))
return hex.EncodeToString(r[:])
}
func sha1f(fName string) string {
f, e := os.Open(fName)
if e != nil {
log.Fatal(e)
}
h := sha1.New()
_, e = io.Copy(h, f)
if e != nil {
log.Fatal(e)
}
return hex.EncodeToString(h.Sum(nil))
}
func main() {
fmt.Println(md5s("Hello, Gopher!"))
fmt.Println(md5f("E:\\testfile"))
fmt.Println(sha1s("Hello, Gopher!"))
fmt.Println(sha1f("E:\\testfile"))
}