当前位置: 首页 > news >正文

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
}

相关文章:

Gin 框架之用户密码加密

文章目录 一、引入二、密码加密位置三、如何加密四、bcrypt 库加密4.1 介绍4.2 优点:4.3 使用 五、小黄书密码加密实践 一、引入 Gin是一个用Go语言编写的Web框架,而用户密码的加密通常是在应用程序中处理用户身份验证时的一个重要问题。 通常敏感信息…...

【创作活动】ChatGPT 和文心一言哪个更好用?

文章目录 文心一言优点缺点 ChatGPT优点缺点 Java编码能力比较对人工智能的看法 ChatGPT是由OpenAI开发的交互式AI大模型, 文心一言是由百度研发的知识增强大语言模型,本文从Java开发的角度对比一下哪个更好用(本文仅用于投稿CSDN创造活动&am…...

【linux】查看Debian应用程序图标对应的可执行命令

在Debian系统中,应用程序图标通常与.desktop文件关联。您可以通过查看.desktop文件来找到对应的可执行命令。这些文件通常位于/usr/share/applications/或~/.local/share/applications/目录下。这里是如何查找的步骤: 1. 打开文件管理器或终端。 2. 导…...

TortoiseSVN客户端如何安装配置并实现公网访问服务端提交文件到本地服务器

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统,它与Apache Subversion(SVN)集成在一起,提供了一个用户友好的界面,方便用…...

【AUTOSAR】RTE 接口类型、应用场景差别及实例讲解

目录 摘要 概念 CS接口 SR接口 接口选择 对于CPU负载率的影响...

Qt应用开发(安卓篇)——Hello Qt On Android

一、前言 这一篇从实际出发,讲述如何创建、编译和部署Qt On Android项目。 二、ADB调试 ADB的全称为Android Debug Bridge,就是起到调试桥的作用,主要用于连接计算机与Android 设备,以便进行调试和数据传输。ADB 可以实现以下主要…...

第十三讲_css 伸缩盒模型flex

css 伸缩盒模型flex 1. 伸缩盒模型介绍2. 伸缩盒模型的主轴方向3. 伸缩盒模型的主轴换行4. 主轴上的对齐方式5. 侧轴上对齐方式5.1 一行的侧轴上对齐方式5.2 多行的侧轴上对齐方式 6. 伸缩项目的伸缩性6.1 伸缩项目在主轴上的基准长度6.2 伸缩项目的放大6.3 伸缩项目的缩小 7. …...

【C++干货铺】C++11常用新特性 | 列表初始化 | STL中的变化

个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 C11简介 列表初始化 std::initializer_list std::initializer_list使用场景 decltype关键字 STL中的一些变化 新容器 array forward_list 容器中的一些新…...

k8s的对外服务---ingress

service的作用体现在两个方面: 集群内部:不断追踪pod的变化。他会更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制。 集群外部:类似负载均衡器,把流量IP端口,不涉及转发url(http、htt…...

element-ui的el-upload组件实现上传拖拽排序图片顺序(sortablejs)

<template><!-- 省略其他配置 --><el-upload ref"upload" :file-list.sync"fileList"></el-upload></template><script>import Sortable from sortablejs;export default {data() {return {fileList: []};},mounted()…...

【PS】PS设计图欣赏、学习、借鉴

【PS】PS设计图欣赏、学习、借鉴 bilibili萌新PS学习计划&#xff1a;PS教程全套零基础教学视频&#xff08;全套81节全新版本&#xff09;...

游戏云化好吗?游戏云化会带来什么?

随着云计算技术的飞速发展&#xff0c;游戏云化成为游戏产业中备受关注的话题。这一新兴技术给玩家和游戏行业带来了全新的可能性。本文将深入探讨游戏云化的概念、优势以及可能带来的影响。 1、什么是游戏云化&#xff1f; 游戏云化是指将游戏的各个环节&#xff0c;包括游戏…...

制造业企业数字化转型难点剖析及解决之法

导语 全球正在由工业经济向数字经济转型过渡&#xff0c;制造业正在且并将长期处于数字化转型发展阶段&#xff0c;并沿着数字化、网络化、智能化阶段不断跃升。但如何找准数字化转型的切入点&#xff0c;以低耗能、低成本、高效率的方式加快制造业转型升级的步伐&#xff0c;仍…...

golang 服务端遇到strict-origin-when-cross-origin,解决跨域整理

golang 服务端遇到strict-origin-when-cross-origin&#xff0c;解决跨域整理 以下内容由chatgpt中文网 动态生成,助力开发找我 代码汇总&#xff1a; func Cors() gin.HandlerFunc {return func(c *gin.Context) {method : c.Request.Methodorigin : c.Request.Header.Get(…...

分布式事务Seata实战-AT模式(注册中心为Eureka)

大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。 本项目是以官网的给的示例&#xff08;即下图&#xff09;进行创建的&#xff0c;以Eureka为注册中心。 官网&#xff1a;Seata AT 模式 | Apache Seata™ 官方代码示例&#xff1a; 快速启动 | Apac…...

windows vscode jsoncpp cmake c++ 构建项目

jsoncpp的编译和使用推荐文章&#xff1a;jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master&#xff1a;https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp&#xff0c;…...

按照一定规则批量修改文件夹内文件的名称

#一个小朋友问我的问题&#xff0c;写好后&#xff0c;就想着分享出来# #目前只想到这一个普通的方法&#xff0c;应该还有更巧妙的方法&#xff0c;读者可以自己思考# 需求&#xff1a;给定文件夹40001&#xff0c;要求将该文件夹内的图片按照40001_00000001,40002_00000002…...

Git项目分支管理规范

一、分支管理 创建项目时&#xff0c;会针对不同环境创建两个常设分支(也可以算主分支&#xff0c;永久不会删除) master&#xff1a;生产环境的稳定分支&#xff0c;生产环境基于该分支构建。仅用来发布新版本&#xff0c;除了从release测试分支或 hotfix-*Bug修复分支进行m…...

ycsb压测mongodb

下载解压 https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-mongodb-binding-0.17.0.tar.gz tar -zxvf ycsb-mongodb-binding-0.17.0.tar.gzycsb提前已经在workload文件夹下准备好了几个压测场景分别对应workload[a:f] workloads/workloada 样例 …...

【zip密码】Zip压缩包删除密码方法,有哪些?

大家都知道压缩包可以进行加密&#xff0c;但是当我们不需要加密压缩包的时候&#xff0c;该如何删除zip压缩包密码呢&#xff1f;那么zip压缩包密码取消都有什么方法呢&#xff1f;今天将方法总结分享给大家。 最原始的方法&#xff0c;就是通过解压文件&#xff0c;将解压出…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...