crypto库是Go生态中密码学功能的核心,它为Go开发者提供了一套全面、安全、保持现代化、提供安全默认值且易于使用的密码学工具,使得在Go应用程序中实现各种密码学功能需求时变得简单而可靠。
Go的密码学功能(即我们统一称的crypto库)分为两个主要部分:标准库的crypto相关包和扩展库golang.org/x/crypto。这种分离设计有其特定的目的和优势:
- Go标准库的
crypto相关包,包含了最基础、最稳定和使用最广泛的密码学算法。这些算法实现经过Go团队的严格审查,保证了长期稳定性和向后兼容性。同时,这些包是随Go安装包分发的,使用时再无需引入额外的依赖。 - 而
golang.org/x/crypto则号称是Go标准库crypto相关包的补充库,虽然它同样由Go团队维护,但由于不是标准库,它可以包含更多实验性或较新的密码学算法及实现,并可以更快速的迭代和更新。这样它也可以成为Go标准库中一些crypto相关包的“孵化器”,就像当年golang.org/x/net/context提升为标准库context一样。
哈希函数 #
md5 #
- 功能:实现MD5哈希算法
- 用途:生成数据的128位哈希值
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
)
func main() {
sum := md5.Sum([]byte("HelloWorld"))
str := hex.EncodeToString(sum[:])
fmt.Println(str)
}
- 使用建议:不推荐用于安全相关用途,因为MD5已被证明不够安全。
sha1 #
- 功能:实现SHA-1哈希算法
- 用途:生成数据的160位哈希值
package main
import (
"crypto/sha1"
"encoding/hex"
"fmt"
)
func main() {
sum := sha1.Sum([]byte("HelloWorld"))
str := hex.EncodeToString(sum[:])
fmt.Println(str)
}
- 使用建议:不推荐用于安全相关用途,因为SHA-1已被证明存在碰撞风险。
sha256 #
- 功能:实现SHA-256哈希算法
- 用途:生成数据的256位哈希值
package main
import (
"crypto/sha256"
"encoding/hex"
"fmt"
)
func main() {
sum := sha256.Sum256([]byte("HelloWorld"))
str := hex.EncodeToString(sum[:])
fmt.Println(str)
}
- 使用建议:推荐使用,安全性高。
sha512 #
- 功能:实现SHA-512哈希算法
- 用途:生成数据的512位哈希值
package main
import (
"crypto/sha512"
"encoding/hex"
"fmt"
)
func main() {
sum := sha512.Sum512([]byte("HelloWorld"))
str := hex.EncodeToString(sum[:])
fmt.Println(str)
}
- 使用建议:推荐使用,安全性很高。
加密和解密 #
密码加密 #
用于密码存储和校验。
package utils
import (
"golang.org/x/crypto/bcrypt"
)
// HashPassword 对密码进行哈希加密
func HashPassword(password string) (string, error) {
fromPassword, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(fromPassword), err
}
// CheckPasswordHash 验证密码
func CheckPasswordHash(hash, password string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}