Go Lang使用bcrypt对用户数据加密,避免字典攻击
Go语言提供了一种较为安全的加密方式,使用GoLang golang.org/x/crypto/bcrypt 模块,通过该模块可以快速实现密码的存储处理,每次运行,计算的密码值都不同。因此使用GoLang golang.org/x/crypto/bcrypt 模块对密码进行处理,可以避免字典攻击。
1.命令行下安装 bcrypt 包:
go get golang.org/x/crypto/bcrypt
2.安装bcrypt包失败,使用代理或者直接使用Git拉取:
git clone https://github.com/golang/crypto.git
3.bcrypt对数据加密处理
package main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
)
func main() {
hashpass := enPass("admin") // 密码加密,返回加密后的密码
checkPwd("admin", hashpass) // 校验密码
}
// 加密
func enPass(passWd string) string {
fmt.Println("====模拟注册时密码加密====")
// 1、获取用户传来的pwd,使用字节切片转换
originPwd := []byte(passWd)
// 2、调用 bcrypt.GenerateFromPassword 生成加密字符串
hashPwd, err := bcrypt.GenerateFromPassword(originPwd, bcrypt.DefaultCost)
if err != nil {
fmt.Println(err)
}
// 3、此时 hashPwd 为字节切片,实际加密字符串需使用string转换
encodePWD := string(hashPwd) // 可以将此加密串保存到数据库,可作为密码匹配验证
fmt.Println(encodePWD)
return encodePWD
}
/*
* 验证密码是否匹配
* input_pass 用户输入的密码
* data_pass 数据库中查询出的加密后的密码
*/
func checkPwd(inputPass, dataPass string) bool {
fmt.Println("====模拟登录====")
// 1、将数据库中的加密串做字节切片转换
//byteHashPwd := []byte("$2a$10$XgJGdy.uxXPBWgw6povXNeds8JjJ9KOJiTp96MutoDus1x5nUuTOS") // 从数据库中读取到的加密后的密码数据
byteHashPwd := []byte(dataPass) // 实际的加密字符串
// 2、调用 bcrypt.CompareHashAndPassword 证密码是否匹配
// 第一个参数为通过字节切片转换的加密的哈希串、第二个参数为字节切片转换过的用户输入密码值
err := bcrypt.CompareHashAndPassword(byteHashPwd, []byte(inputPass))
// 没有错误则密码匹配
if err != nil {
fmt.Println("pwd wrong", err)
return false
} else {
fmt.Println("pwd ok")
return true
}
}

浙公网安备 33010602011771号