Gin 框架之用户密码加密

文章目录

    • 一、引入
    • 二、密码加密位置
    • 三、如何加密
    • 四、bcrypt 库加密
      • 4.1 介绍
      • 4.2 优点:
      • 4.3 使用
    • 五、小黄书密码加密实践

一、引入

Gin是一个用Go语言编写的Web框架,而用户密码的加密通常是在应用程序中处理用户身份验证时的一个重要问题。

通常敏感信息你要防两类人:

  • 研发人员:包括你自己和你的同事。作为研发人员,你可能会接触到公司的敏感信息,如用户数据、商业机密等。
  • 攻击者:指那些有意获取或破坏敏感信息的人。他们可能是黑客、竞争对手、内部威胁等。

所以为了增加安全性,密码通常不应以明文形式存储在数据库中,而是应该经过适当的加密处理。

二、密码加密位置

实际上,你选择 servicerepositorydao,包括 domain 都可以:

  • service 加密:加密是一个业务概念,不是一个存储概念。
  • repository 加密:加密是一个存储概念,毕竟我们说的是“加密存储”。
  • dao 加密:加密是一个数据库概念,因为我完全可以选择利用数据库本身的加密功能来实现。
  • domain 加密:加密是一个业务概念,但是应该是“用户(User)”自己才知道怎么加密。

三、如何加密

加密算法的选择会直接影响你整个系统的安全性,因为攻击者一旦拿到了密码,差不多就可以为所欲为了。

选择加密算法的标准就一个,难破解。你要考虑以下问题:

  • 相同的密码,加密后的结果应该不同。你可以预期,很多用户习惯用 123456 这种密码,但是我们希望数据库存储的值还是不一样。
  • 难以通过碰撞、彩虹表来破解。

常见的加密算法无非就是下面这些,安全性逐步提高:

  1. md5 之类的哈希算法。

  2. 在 1 的基础上,引入了盐值(salt),或者进行多次哈希等。

  3. PBKDF2BCrypt 这一类随机盐值的加密算法,同样的文本加密后的结果都不同。

四、bcrypt 库加密

4.1 介绍

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

4.2 优点:

  • 不需要你自己去生成盐值。

  • 不需要额外存储盐值。

  • 可以通过控制 cost 来控制加密性能。

  • 同样的文本,加密后的结果不同。

4.3 使用

首先,你需要在Go中安装bcrypt库:

go get golang.org/x/crypto/bcrypt

下面是一个使用bcrypt库在对用户密码进行加密的示例:

package mainimport ("fmt""golang.org/x/crypto/bcrypt"
)func main() {// 用户注册时使用的密码password := "user_password"// 使用bcrypt库对密码进行哈希处理hashedPassword, err := hashPassword(password)if err != nil {fmt.Println("Error hashing password:", err)return}fmt.Println("Original Password:", password)fmt.Println("Hashed Password:", hashedPassword)// 模拟用户登录时的密码验证err = comparePasswords(hashedPassword, "wrong_password")if err != nil {fmt.Println("Password does not match:", err)} else {fmt.Println("Password matches!")}err = comparePasswords(hashedPassword, "user_password")if err != nil {fmt.Println("Password does not match:", err)} else {fmt.Println("Password matches!")}
}func hashPassword(password string) (string, error) {// 使用bcrypt库的GenerateFromPassword函数进行哈希处理hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)if err != nil {return "", err}return string(hashedPassword), nil
}func comparePasswords(hashedPassword, inputPassword string) error {// 使用bcrypt库的CompareHashAndPassword函数比较密码err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(inputPassword))return err
}

加密后的结果如下:

五、小黄书密码加密实践

webook/internal/service/user.go:

func (svc *UserService) SignUp(ctx context.Context, u domain.User) error {// 先加密密码hash, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)if err != nil {return err}u.Password = string(hash)// 然后存起来return svc.repo.Create(ctx, u)
}func (svc *UserService) Login(ctx context.Context, email, password string) (domain.User, error) {// 先找用户u, err := svc.repo.FindByEmail(ctx, email)if err == repository.ErrUserNotFound {return domain.User{}, ErrInvalidUserOrPassword}if err != nil {return domain.User{}, err}// 比较密码了err = bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))if err != nil {return domain.User{}, ErrInvalidUserOrPassword}return u, nil
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/414200.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 类与对象Oop

类与对象Oop 一、类:用户定义的数据类型,用于封装数据和方法1.1 对比结构体警告-->主要目的:初始化 1.2 定义类的过程并定义一个对象1.2.1 定义类例子 1.2.2 定义一个对象1.2.3 注意事项例子1.2.4 分成头文件和源文件的方式(0&…

Niushop 开源微信商城源码+小程序源码 v5.1.7/支持二开/支持PC、手机、小程序和APP电商源码

源码介绍: Niushop 开源微信商城源码 v5.1.7,它是小程序源码,支持二次开发,同时支持PC、手机、小程序和APP多端电商。 Niushop系统是一款基于ThinkPHP6开发的全面完善的电商解决方案。该系统具备完善的商品管理机制,…

目标检测中的数据增强

整个代码参考:bubbliiiing/object-detection-augmentation。 random_data.py import cv2 import numpy as np from PIL import Image, ImageDrawdef rand(a=0, b=1):return np.random.rand()*(b-a) + adef get_random_data(annotation_line, input_shape, jitter=.3, hue=.1…

中仕公考:国考进面后资格复审需要准备什么?

参加国考面试的考生在资格审核阶段需要准备以下材料: 1、本人身份证、学生证或工作证复印件。 2、公共科目笔试准考证复印件。 3、考试报名登记表。 4、本(专)科、研究生各阶段学历、学位证书(应届毕业生没有可以暂时不提供)。 5、报名资料上填写的各类证书材料…

数据结构实验6:图的应用

目录 一、实验目的 1. 邻接矩阵 2. 邻接矩阵表示图的结构定义 3. 图的初始化 4. 边的添加 5. 边的删除 6. Dijkstra算法 三、实验内容 实验内容 代码 截图 分析 一、实验目的 1.掌握图的邻接矩阵的存储定义; 2.掌握图的最短路径…

网络安全产品之认识WEB应用防火墙

随着B/S架构的广泛应用,Web应用的功能越来越丰富,蕴含着越来越有价值的信息,应用程序漏洞被恶意利用的可能性越来越大,因此成为了黑客主要的攻击目标。传统防火墙无法解析HTTP应用层的细节,对规则的过滤过于死板&#…

VsCode重新安装需要配机的ESLint和 Prettier - Code formatter 配置

新电脑安装完Vscode后,需要装几个插件,这里记录下: {"diffEditor.ignoreTrimWhitespace": false,"files.autoSave": "afterDelay","editor.codeActionsOnSave": {"source.fixAll.eslint"…

【leetcode】消失的数字

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1.暴力求解法2.采用异或的方法(同单身狗问题)3.先求和再减去数组元素 点击查看…

Leetcode刷题笔记题解(C++):200. 岛屿数量

思路&#xff1a;利用深度优先搜索的思路来查找1身边的1&#xff0c;并且遍历之后进行0替换防止重复dfs&#xff0c;代码如下所示 class Solution { public:int numIslands(vector<vector<char>>& grid) {int row grid.size();int col grid[0].size();int n…

Unity之四元数

欧拉角 万向节死锁 四元数是什么 Unity中四元数的初始化 四元数和欧拉角的互相转换 补充 四元数相乘代表旋转四元数

一张图描述Http常用状态码(301、302、305、404、408等等)

301—永久移动。被请求的资源已被永久移动位置&#xff1b; 302—请求的资源现在临时从不同的 URI 响应请求&#xff1b; 305—使用代理。被请求的资源必须通过指定的代理才能被访问&#xff1b; 307—临时跳转。被请求的资源在临时从不同的URL响应请求&#xff1b; 40…

往docker中cloudbeaver的容器添加达梦数据库、impala数据库连接支持(cloudbeaver添加自定义数据连接)

cloudbeaver默认没有开放impala连接&#xff0c;更不会支持国产数据库了 docker安装运行cloudbeaver可以参考文章&#xff1a;docker安装运行CloudBeaver并设置默认语言为中文 本文跳过cloudbeaver镜像拉取&#xff0c;直接就开始实现自定义数据库连接功能 1、初始化cloudbe…