念念不忘,必有迴響

golang 使用 bcrypt 对密码进行加密验证

  写了一下午的go(beego)... 😔 ,还是从框架入手(光看文档以为是知道了,写起来就是连键盘都不知道怎么敲)

  记录一下这个还能验证Laravel生成的密码。bcrypt包的使用

安装

  • 这个安装起初有点坑
// 以为
go get -u -v golang.org/x/crypto/bcrypt
...

// 结果
golang.org/x/crypto (download)
Fetching https://golang.org/x/crypto/blowfish?go-get=1
https fetch failed: Get https://golang.org/x/crypto/blowfish?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected
host has failed to respond.
  • 不是墙的问题,最终解决方案请看 stackoverflow (原来让你手动安装.... 😂)
  • 原来还是GFW的问题。。。使用go mod,goproxy 改成goproxy.cn 即可

使用

一共就两个步骤,一个生成加密串,一个匹配验证密码是否正确

生成加密字符串

// 1、获取用户传来的pwd,使用字节切片转换
originPwd := []byte("password") // 用户传的实际密码值

// 2、调用 bcrypt.GenerateFromPassword 生成加密字符串
hashPwd, _ := bcrypt.GenerateFromPassword(originPwd, bcrypt.DefaultCost)

// 3、此时 hashPwd 为字节切片,实际加密字符串需使用string转换
string(hashPwd) // 可以将此加密串保存到数据库,可作为密码匹配验证

验证密码是否匹配

// 1、将数据库中的加密串做字节切片转换
// $2a$10$oxOlhX8ju5eIwHZkjTwMX.4q64EhyjLtX2m32b2V3CP8yeqzQNVHa
byteHashPwd := []byte("$2sxxx....") // 实际的加密字符串

// 2、调用 bcrypt.CompareHashAndPassword 证密码是否匹配
// 第一个参数为通过字节切片转换的加密的哈希串、第二个参数为字节切片转换过的用户输入密码值
err := bcrypt.CompareHashAndPassword(byteHashPwd, originPwd)
// 没有错误则密码匹配
if err != nil {
    log.Println(err)
    return false
}

-- END

写的不错,赞助一下主机费

扫一扫,用支付宝赞赏
扫一扫,用微信赞赏
2019-09-23 19:50

不是墙的问题