crypto/md5 包基本用法
crypto/md5 包实现了 MD5 哈希算法。
基本用法
package main
import (
"crypto/md5"
"fmt"
)
func main() {
// 计算字符串的 MD5
data := []byte("Hello, World!")
hash := md5.Sum(data)
// 输出十六进制格式
fmt.Printf("MD5: %x\n", hash)
}
使用 Hash 接口
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
)
func main() {
// 创建哈希器
h := md5.New()
// 分多次写入数据
h.Write([]byte("Hello, "))
h.Write([]byte("World!"))
// 计算哈希
sum := h.Sum(nil)
// 输出结果
fmt.Printf("MD5 (hex): %s\n", hex.EncodeToString(sum))
fmt.Printf("MD5 (raw): %x\n", sum)
}
文件 MD5
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"os"
)
func main() {
// 打开文件
file, err := os.Open("test.txt")
if err != nil {
panic(err)
}
defer file.Close()
// 创建 MD5 哈希器
hash := md5.New()
// 复制文件内容到哈希器
if _, err := io.Copy(hash, file); err != nil {
panic(err)
}
// 获取哈希值
md5Value := hex.EncodeToString(hash.Sum(nil))
fmt.Printf("文件 MD5: %s\n", md5Value)
}
校验文件完整性
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"os"
)
// FileMD5 计算文件的 MD5 值
func FileMD5(filename string) (string, error) {
file, err := os.Open(filename)
if err != nil {
return "", err
}
defer file.Close()
hash := md5.New()
if _, err := io.Copy(hash, file); err != nil {
return "", err
}
return hex.EncodeToString(hash.Sum(nil)), nil
}
// VerifyFile 验证文件 MD5
func VerifyFile(filename, expectedMD5 string) (bool, error) {
actualMD5, err := FileMD5(filename)
if err != nil {
return false, err
}
return actualMD5 == expectedMD5, nil
}
func main() {
// 创建测试文件
os.WriteFile("test.txt", []byte("test content"), 0644)
// 计算 MD5
md5Value, err := FileMD5("test.txt")
if err != nil {
panic(err)
}
fmt.Printf("文件 MD5: %s\n", md5Value)
// 验证文件
ok, _ := VerifyFile("test.txt", md5Value)
fmt.Printf("验证结果: %v\n", ok)
// 清理
os.Remove("test.txt")
}
总结
| 方法 | 说明 |
|---|---|
md5.Sum(data) |
直接计算数据的 MD5 |
md5.New() |
创建 Hash 接口实例 |
h.Write(data) |
向哈希器写入数据 |
h.Sum(nil) |
获取最终的哈希值 |
MD5 算法已被证明不安全,不推荐用于密码存储或安全敏感场景。请使用
crypto/sha256 等更安全的算法。