Golang使用bcrypt实现密码加密和校验的操作代码
bcrypt可以用于数据库中的用户密码保存,相比md5而言更加的安全可靠
文档
https://pkg.go.dev/golang.org/x/crypto/bcrypt
文档上给出了标准文档,这个库是下面这个文件描述的算法golang实现:
https://www.javascriptusenjavascriptix.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$EvdBpymvP7uDfI0TFRD6RO3YXLwQpythonWUVYKMDqbWFloYCtyNXHCmbD2" err := bcrypt.CompareHashAndPassword([]byte(hashedPwww.devze.comassword), []byte(password)) fmt.Println(err) // <nil> }
由于算法的入参和出参都是字节类型的数据,为了便于使用,可以将两个方法简单封装成一个工具类,将入参和出参都改为是字符串类型的数据
package utils import ( "golang.org/x/crypto/bcrypt"php ) 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 }
到此这篇关于Golang使用bcrypt实现密码加密和校验的文章就介绍到这了,更多相关Golang密码加密和校验内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论