bcrypt可以用于数据库中的用户密码保存,相比md5而言更加的安全可靠
文档
https://pkg.go.dev/golang.org/x/crypto/bcrypt
文档上给出了标准文档,这个库是下面这个文件描述的算法golang实现:
https://www.usenix.org/legacy/event/usenix99/provos/provos.pdf
安装
go get -u golang.org/x/crypto/bcrypt
加密示例
package main import ( "fmt" "golang.org/x/crypto/bcrypt" ) func main() { password := "123456" hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) fmt.Println(string(hashedPassword)) // $2a$10$EvdBpymvP7uDfI0TFRD6RO3YXLwQWUVYKMDqbWFloYCtyNXHCmbD2 // $2a$10$6JDH6z7dJljoDo4VolpHbeIgzqHwhUvF1JRJ/h7Ibf/PjGtx.wZGG }
可以看到,多次运行后,生成的结果是不一样的
bcrypt不能解密,不过可以比较加密后的数据和加密前的数据是否相匹配
package main import ( "fmt" "golang.org/x/crypto/bcrypt" ) func main() { password := "123456" hashedPassword := "$2a$10$EvdBpymvP7uDfI0TFRD6RO3YXLwQWUVYKMDqbWFloYCtyNXHCmbD2" err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password)) fmt.Println(err) // <nil> }
由于算法的入参和出参都是字节类型的数据,为了便于使用,可以将两个方法简单封装成一个工具类,将入参和出参都改为是字符串类型的数据
package utils import ( "golang.org/x/crypto/bcrypt" ) func GenerateFromPassword(password string) (string, error) { hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { return "", err } return string(hashedPassword), err } func CompareHashAndPassword(hashPassword string, password string) bool { err := bcrypt.CompareHashAndPassword([]byte(hashPassword), []byte(password)) return err == nil }