密码处理
基于 bcrypt 的密码加密与验证
密码处理
xUtil.Password() 提供基于 bcrypt 的密码加密和验证函数,额外使用 Base64 编码增强安全性。
import xUtil "github.com/xiaolfeng/bamboo-base-go/common/utility"入口函数
func Password() *pack.Password加密流程
明文密码 → Base64 编码 → bcrypt 哈希 → 存储Encrypt
加密密码并返回字节切片:
func (p *Password) Encrypt(pass string) ([]byte, error)MustEncrypt
加密密码,失败时 panic:
func (p *Password) MustEncrypt(pass string) []byteEncryptString
加密密码并返回字符串:
func (p *Password) EncryptString(pass string) (string, error)MustEncryptString
加密密码返回字符串,失败时 panic:
func (p *Password) MustEncryptString(pass string) string示例:
// 推荐:返回字符串,便于存储
hash, err := xUtil.Password().EncryptString("myPassword123")
if err != nil {
log.Fatal(err)
}
// 简便方式(失败时 panic)
hash := xUtil.Password().MustEncryptString("myPassword123")Verify
验证密码是否匹配:
func (p *Password) Verify(inputPass, hashPass string) error返回: 匹配返回 nil,不匹配返回错误。
IsValid
验证密码是否匹配(布尔值):
func (p *Password) IsValid(inputPass, hashPass string) bool示例:
hash := xUtil.Password().MustEncryptString("myPassword123")
// 方式一:检查错误
err := xUtil.Password().Verify("myPassword123", hash)
if err != nil {
fmt.Println("密码错误")
}
// 方式二:布尔值
if xUtil.Password().IsValid("myPassword123", hash) {
fmt.Println("密码正确")
}使用示例
用户注册
func (s *UserService) Register(ctx context.Context, req *dto.RegisterRequest) error {
// 加密密码
hash, err := xUtil.Password().EncryptString(req.Password)
if err != nil {
return err
}
user := &entity.User{
Username: req.Username,
Password: hash,
}
return s.repo.Create(ctx, user)
}用户登录
func (s *UserService) Login(ctx context.Context, req *dto.LoginRequest) (*entity.User, error) {
user, err := s.repo.FindByUsername(ctx, req.Username)
if err != nil {
return nil, err
}
// 验证密码
if !xUtil.Password().IsValid(req.Password, user.Password) {
return nil, errors.New("密码错误")
}
return user, nil
}修改密码
func (s *UserService) ChangePassword(ctx context.Context, userID int64, oldPass, newPass string) error {
user, err := s.repo.FindByID(ctx, userID)
if err != nil {
return err
}
// 验证旧密码
if !xUtil.Password().IsValid(oldPass, user.Password) {
return errors.New("原密码错误")
}
// 加密新密码
hash, err := xUtil.Password().EncryptString(newPass)
if err != nil {
return err
}
return s.repo.UpdatePassword(ctx, userID, hash)
}安全说明
- bcrypt: 使用 bcrypt 算法,自动加盐,抗彩虹表攻击
- Base64 预处理: 先进行 Base64 编码,增加一层保护
- 默认成本: 使用
bcrypt.DefaultCost(10),平衡安全性和性能 - 不可逆: 哈希后的密码无法还原为明文