打开 golang 包对应的网站: https://pkg.go.dev/,搜索 md5
MD5
查看Example
func New hash.Hash
案例一:Example
package main
import (
"crypto/md5"
"fmt"
"io"
)
func main() {
h := md5.New()
//两个字符串的内容会被合并在一起进行哈希计算
io.WriteString(h, "这是加密的字符串") //将字符串写入到哈希对象中
io.WriteString(h, "这也是加密的字符串") //将字符串写入到哈希对象中
...//可以多个加密串
fmt.Printf("%x", h.Sum(nil)) //调用h.Sum(nil)获取当前哈希计算的最终结果
}
这段Go代码主要用于计算两个字符串连接后生成的MD5哈希值。具体步骤如下:
-
通过
md5.New()
初始化一个MD5哈希对象h
。 -
使用
io.WriteString(h, "
这是加密的字符串")
向哈希对象h
写入字符串"这是加密的字符串",这一操作会根据输入数据更新哈希对象的内部状态。 -
接着,用相似的方式通过
io.WriteString(h, "
这也是加密的字符串")
将另一字符串"这也是加密的字符串"写入到哈希对象中。这两个字符串的内容会被合并在一起进行哈希计算,而不是分别计算。 -
最后,通过调用
h.Sum(nil)
获取当前哈希计算的最终结果(以字节形式),并使用fmt.Printf
与%x
格式化该字节切片为十六进制字符串输出。
如果运行此代码,它将输出一个类似于这样的MD5哈希值(实际值会根据内容确定):
1c9f0f895fb98ab9159f51fd8169c5a4d
需要注意的是,MD5因存在安全漏洞,特别是容易受到碰撞攻击,所以不建议用于加密或安全验证等场景。现在多用于校验和或兼容旧系统。对于安全哈希需求,推荐使用SHA-256或更新的算法。
案例二:Example (File)
package main
import (
"crypto/md5"
"fmt"
"io"
"log"
"os"
)
func main() {
//获取文件内容
f, err := os.Open("file.txt")//123456
if err != nil {
log.Fatal(err)
}
defer f.Close() //最后关闭IO流
h := md5.New()
if _, err := io.Copy(h, f); err != nil {
log.Fatal(err)
}
//e10adc3949ba59abbe56e057f20f883e
fmt.Printf("%x", h.Sum(nil))
}
func Sum
Example
package main
import (
"crypto/md5"
"fmt"
)
func main() {
data := []byte("123456")
//e10adc3949ba59abbe56e057f20f883e
fmt.Printf("%x", md5.Sum(data))
}
sha-256
方式一
如果你需要逐步处理大量数据或流式数据的哈希计算,第一种方法(使用Write)更加灵活和高效,因为它允许你分批处理数据
package main
import (
"crypto/sha256"
"fmt"
)
func main() {
// h := sha256.New() 创建了一个SHA-256哈希对象,然后通过h.Write([]byte("123456"))分步写入数据,最后使用h.Sum(nil)获得哈希值
// 如果你需要逐步处理大量数据或流式数据的哈希计算,第一种方法(使用Write)更加灵活和高效,因为它允许你分批处理数据。
h := sha256.New()
h.Write([]byte("123456"))
h.Write([]byte("123456"))
fmt.Printf("%x", h.Sum(nil))
}
方式二
直接Sum256)更适用于一次性处理较小或单一的数据块,代码更为简洁
package main
import (
"crypto/sha256"
"fmt"
)
func main() {
// hash := sha256.Sum256(data)一步到位计算出哈希值,其中data是事先准备好的字节切片
// 直接Sum256)更适用于一次性处理较小或单一的数据块,代码更为简洁
data := []byte("123456")
hash := sha256.Sum256(data)
fmt.Printf("%x", hash)
}
SHA-3系列(如SHA3-256)
SHA-3是继SHA-2之后的新一代安全哈希算法标准,提供更好的抗分析特性。在Go中,通过
golang.org/x/crypto/sha3
包使用。
package main
import (
"fmt"
"golang.org/x/crypto/sha3"
)
func main() {
//方式一
h := sha3.New256()
h.Write([]byte("123456"))
h.Write([]byte("123456"))
fmt.Printf("%x", h.Sum(nil))
//方式二
data := []byte("123456")
hash := sha3.Sum256(data)
fmt.Printf("%x", hash)
}
第三方及存储密码
-
Blake2: Blake2是一种高效的哈希函数,设计时就注重了速度和安全性。Go标准库并未直接包含Blake2,但你可以使用第三方库,如
github.com/minio/blake2b-simd
。 -
bcrypt: 对于密码存储,bcrypt是一种专为此目的设计的算法,它通过增加计算成本来抵抗暴力破解。Go中可使用
golang.org/x/crypto/bcrypt
包。package main import ( "fmt" "golang.org/x/crypto/bcrypt" ) func main() { password := []byte("123456") hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost) if err != nil { panic(err) } fmt.Printf("%x", hashedPassword) }
选择哪种算法取决于具体应用场景,但出于安全考虑,通常推荐至少使用SHA-256或SHA-3,而对于存储用户密码,则推荐使用bcrypt或类似的专为密码存储设计的算法。