ToB企服应用市场:ToB评测及商务社交产业平台

标题: Gin 框架之用户密码加密 [打印本页]

作者: 数据人与超自然意识    时间: 2024-4-8 07:17
标题: Gin 框架之用户密码加密
目录

一、引入

Gin是一个用Go语言编写的Web框架,而用户密码的加密通常是在应用程序中处理用户身份验证时的一个重要问题。
通常敏感信息你要防两类人:
所以为了增加安全性,密码通常不应以明文形式存储在数据库中,而是应该经过适当的加密处理。
二、密码加密位置

实际上,你选择 service、repository、dao,包括 domain 都可以:

三、如何加密

加密算法的选择会直接影响你整个系统的安全性,因为攻击者一旦拿到了密码,差不多就可以为所欲为了。
选择加密算法的标准就一个,难破解。你要考虑以下问题:
常见的加密算法无非就是下面这些,安全性逐步提高:
四、bcrypt 库加密

4.1 介绍

在Go语言中,可以使用bcrypt库来对密码进行安全加密,号称最安全的加密算法。
4.2 优点:

4.3 使用

首先,你需要在Go中安装bcrypt库:
  1. go get golang.org/x/crypto/bcrypt
复制代码
下面是一个使用bcrypt库在对用户密码进行加密的示例:
  1. package main
  2. import (
  3.         "fmt"
  4.         "golang.org/x/crypto/bcrypt"
  5. )
  6. func main() {
  7.         // 用户注册时使用的密码
  8.         password := "user_password"
  9.         // 使用bcrypt库对密码进行哈希处理
  10.         hashedPassword, err := hashPassword(password)
  11.         if err != nil {
  12.                 fmt.Println("Error hashing password:", err)
  13.                 return
  14.         }
  15.         fmt.Println("Original Password:", password)
  16.         fmt.Println("Hashed Password:", hashedPassword)
  17.         // 模拟用户登录时的密码验证
  18.         err = comparePasswords(hashedPassword, "wrong_password")
  19.         if err != nil {
  20.                 fmt.Println("Password does not match:", err)
  21.         } else {
  22.                 fmt.Println("Password matches!")
  23.         }
  24.         err = comparePasswords(hashedPassword, "user_password")
  25.         if err != nil {
  26.                 fmt.Println("Password does not match:", err)
  27.         } else {
  28.                 fmt.Println("Password matches!")
  29.         }
  30. }
  31. func hashPassword(password string) (string, error) {
  32.         // 使用bcrypt库的GenerateFromPassword函数进行哈希处理
  33.         hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
  34.         if err != nil {
  35.                 return "", err
  36.         }
  37.         return string(hashedPassword), nil
  38. }
  39. func comparePasswords(hashedPassword, inputPassword string) error {
  40.         // 使用bcrypt库的CompareHashAndPassword函数比较密码
  41.         err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(inputPassword))
  42.         return err
  43. }
复制代码
加密后的结果如下:

五、小黄书密码加密实践

webook/internal/service/user.go:
  1. func (svc *UserService) SignUp(ctx context.Context, u domain.User) error {
  2.         // 先加密密码
  3.         hash, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
  4.         if err != nil {
  5.                 return err
  6.         }
  7.         u.Password = string(hash)
  8.         // 然后存起来
  9.         return svc.repo.Create(ctx, u)
  10. }
  11. func (svc *UserService) Login(ctx context.Context, email, password string) (domain.User, error) {
  12.         // 先找用户
  13.         u, err := svc.repo.FindByEmail(ctx, email)
  14.         if err == repository.ErrUserNotFound {
  15.                 return domain.User{}, ErrInvalidUserOrPassword
  16.         }
  17.         if err != nil {
  18.                 return domain.User{}, err
  19.         }
  20.         // 比较密码了
  21.         err = bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
  22.         if err != nil {
  23.                 return domain.User{}, ErrInvalidUserOrPassword
  24.         }
  25.         return u, nil
  26. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4