用户密码加密
bcrypt 是专门为密码存储而设计的算法,基于 Blowfish 加密算法变形而来,由 Niels Provos 和 David Mazières 发表于 1999 年的 USENIX。
bcrypt 最大的好处是有一个参数(work factor), 可用于调整计算强度,而且 work factor 是包括在输出的摘要中的。随着攻击者计算能力的提高,使用者可以逐步增大 work factor,而且不会影响已有用户的登陆。
bcrypt 经过了很多安全专家的仔细分析,使用在以安全著称的 OpenBSD 中,一般认为它比 PBKDF2 更能承受随着计算能力加强而带来的风险。bcrypt 也有广泛的函数库支持,因此我们建议使用这种方式存储密码。
参考链接:如何安全的存储密码
bcrypt 包
Go 的官方包是非常棒的密码加密解决方案,同一个字符串经过每一次加密出来的结果都不一样,也就是不可逆,这样杜绝了黑客拿到加密数据以后倒推数据的可能。
安装 bcrypt 包:go get golang.org/x/crypto/bcrypt
用法
// Hash 使用 bcrypt 对密码进行加密
func Hash(password string) string {
// GenerateFormPassword 函数的第二个参数是 cost 值,建议大于 12,数值越大耗费时间越长
bytes, err := bcrypt.GenerateFormPassword([]byte(password), 14)
logger.LogError(err)
return string(bytes)
}
// CheckHash 对比明文密码和数据库的哈希值
func CheckHash(password, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
logger.LogError(err)
return err == nil
}
// IsHashed 判断字符串是否是哈希过的数据
func IsHashed(str string) bool {
// bcrypt 加密后的长度等于 60
return len(str) == 60
}
配合 GORM 模型钩子使用
GORM 模型钩子 是在创建、查询、更新、删除等操作之前、之后调用的函数。为模型定义指定的方法,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。
// BeforeSave GORM 的模型钩子,在模型创建和更新前调用
// User 为定义的模型
func (u *User) BeforeSave(tx *gorm.DB) (err error) {
// 如果不是哈希过的数据,则进行哈希,password 是自定义封装 hash 的包名
if !password.IsHashed(u.Password) {
u.Password = password.Hash(u.Password)
}
return
}
标签:加密,string,err,一下,密码,password,bcrypt,随记
From: https://www.cnblogs.com/xylx1/p/17158548.html