一般来说,密码是不能明文储存在数据库里面的,所以有的系统会将密码进行 md5
或 sha1
Hash之后存入数据库,这种方案可能会被字典攻击,因此,有了加盐Hash,即将密码和盐组合之后Hash保存到数据库,这种方法基本防止了字典攻击。而在Golang中,Golang提供了一种更为安全的加密方式——crypto/bcrypt
,使用这种方式进行加密的可以使得同一密码每次生成的Hash都是不一样的,这样更进一步防止了字典攻击,更为安全。
文档
https://pkg.go.dev/golang.org/x/crypto/bcrypt
引入模块
go get golang.org/x/crypto/bcrypt
生成hash
//生成hash
hashBytes, _ := bcrypt.GenerateFromPassword([]byte("password"), bcrypt.DefaultCost)
//转换成字符串
hashStr := string(hashBytes)
比较hash
str := "$2a$10$t1EwsX5up21xD1mlwhBKz.LDntnInkQRsq/9SczDp7P0adXh0PdAa"
//若err不为空说明密码不匹配
err := bcrypt.CompareHashAndPassword([]byte(str), []byte("password"))
demo
package main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
)
func main() {
//生成hash
hashBytes, _ := bcrypt.GenerateFromPassword([]byte("password"), bcrypt.DefaultCost)
//转换成字符串
hashStr := string(hashBytes)
fmt.Println(hashStr)
//测试
str := "$2a$10$t1EwsX5up21xD1mlwhBKz.LDntnInkQRsq/9SczDp7P0adXh0PdAa"
err := bcrypt.CompareHashAndPassword([]byte(str), []byte("password"))
//若err不为空说明密码不匹配
if err != nil {
fmt.Println("fail")
} else {
fmt.Println("success")
}
}