一般来说,密码是不能明文储存在数据库里面的,所以有的系统会将密码进行 md5sha1Hash之后存入数据库,这种方案可能会被字典攻击,因此,有了加盐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")
    }
}
最后修改:2021 年 09 月 26 日
如果觉得我的文章对你有用,请随意赞赏