前言
项目开发过程中,在注册这一块,少不了对用户密码的加密,今天使用bcrypt来实现对密码的加密和验证
bcypt加密和md5加密的不同点在于,后者更安全,对于同一字符串每次生成的编码不同。
代码
1.结构体
type user struct {
id string
pwd string
}
// 模拟数据库
var userList = make([]user,0)
2.注册功能
func Register(us user) error {
if userIsExit(us.id){
return errors.New("用户已存在")
}
// 对用户密码进行加密
userPwd,err := PwdHash(us.pwd)
// 存入数据库
us.pwd = userPwd
userList = append(userList,us)
return err
}
3.加密
// 注意导入 "golang.org/x/crypto/bcrypt"
func PwdHash(pwd string)(string,error){
// 第二个参数是进行哈希的次数,这里采用了默认值10,数字越大生成的密码速度越慢,成本越大。但是更安全
// bcrypt每次生成的编码是不同的,较于md5更安全
bytes,err := bcrypt.GenerateFromPassword([]byte(pwd),bcrypt.DefaultCost)
if err != nil{
return "",err
}
return string(bytes),err
}
4.验证
func PwdVerify(pwd,hash string)bool {
// CompareHashAndPassword 比较用户输入的明文和和数据库取出的的密码解析后是否匹配
err := bcrypt.CompareHashAndPassword([]byte(hash),[]byte(pwd))
return err == nil
}