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
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)