首页 > 其他分享 >Go Lang使用bcrypt对用户数据加密,避免字典攻击

Go Lang使用bcrypt对用户数据加密,避免字典攻击

时间:2024-07-25 15:52:47浏览次数:10  
标签:Lang 加密 err fmt Println 密码 Go bcrypt

Go语言提供了一种较为安全的加密方式,使用GoLang golang.org/x/crypto/bcrypt 模块,通过该模块可以快速实现密码的存储处理,每次运行,计算的密码值都不同。因此使用GoLang golang.org/x/crypto/bcrypt 模块对密码进行处理,可以避免字典攻击。

1.命令行下安装 bcrypt 包:

 go get golang.org/x/crypto/bcrypt

 
2.安装bcrypt包失败,使用代理或者直接使用Git拉取:

git clone https://github.com/golang/crypto.git

 

3.bcrypt对数据加密处理

package main

import (
	"fmt"
	"golang.org/x/crypto/bcrypt"
)

func main() {
	hashpass := enPass("admin") // 密码加密,返回加密后的密码
	checkPwd("admin", hashpass) // 校验密码
}

// 加密
func enPass(passWd string) string {
	fmt.Println("====模拟注册时密码加密====")
	// 1、获取用户传来的pwd,使用字节切片转换
	originPwd := []byte(passWd)
	// 2、调用 bcrypt.GenerateFromPassword 生成加密字符串
	hashPwd, err := bcrypt.GenerateFromPassword(originPwd, bcrypt.DefaultCost)
	if err != nil {
		fmt.Println(err)
	}
	// 3、此时 hashPwd 为字节切片,实际加密字符串需使用string转换
	encodePWD := string(hashPwd) // 可以将此加密串保存到数据库,可作为密码匹配验证
	fmt.Println(encodePWD)
	return encodePWD
}

/*
 * 验证密码是否匹配
 * input_pass 用户输入的密码
 * data_pass 数据库中查询出的加密后的密码
 */
func checkPwd(inputPass, dataPass string) bool {
	fmt.Println("====模拟登录====")
	// 1、将数据库中的加密串做字节切片转换
	//byteHashPwd := []byte("$2a$10$XgJGdy.uxXPBWgw6povXNeds8JjJ9KOJiTp96MutoDus1x5nUuTOS") // 从数据库中读取到的加密后的密码数据
	byteHashPwd := []byte(dataPass) // 实际的加密字符串

	// 2、调用 bcrypt.CompareHashAndPassword 证密码是否匹配
	// 第一个参数为通过字节切片转换的加密的哈希串、第二个参数为字节切片转换过的用户输入密码值
	err := bcrypt.CompareHashAndPassword(byteHashPwd, []byte(inputPass))
	// 没有错误则密码匹配
	if err != nil {
		fmt.Println("pwd wrong", err)
		return false
	} else {
		fmt.Println("pwd ok")
		return true
	}
}

 

标签:Lang,加密,err,fmt,Println,密码,Go,bcrypt
From: https://www.cnblogs.com/codtina/p/18323350

相关文章

  • MongoDB流量分析
    MongoDB流量分析通常指的是对MongoDB数据库的网络通信量、操作频率、性能指标和资源利用情况进行监控和分析的过程。这有助于理解数据库的负载、性能、潜在的瓶颈和安全状况,以便进行优化和维护。MongoDB流量分析可以涵盖以下几个方面:网络流量监控:监控MongoDB服务器的网络带......
  • 【Django5】模型定义与使用
    系列文章目录第十一章模型定义与使用文章目录系列文章目录前言模型定义模型数据迁移模型查询模型分页查询高级查询匹配符模型多表查询模型数据新增模型数据修改模板删除数据总结前言Django5对各种数据库提供了很好的支持,包括PostgreSQL、MySQL、SQLite和Oracle......
  • Django 信号的配置、定义、种类
     如果你的信号处理程序没有打印任何输出,可能的原因包括信号未正确连接、模型保存未触发信号,或者信号处理程序未正确导入。以下是一些更详细的排查步骤:1.确认apps.py配置确保apps.py文件配置正确,并在ready方法中导入了signals模块:#customerApp/apps.pyfro......
  • 解码包含同意信息的 Google 新闻网址时出现问题
    我在Python中解码base64谷歌新闻URL时遇到了一个特殊问题,因为它们不仅包含URL,还包含同意信息。基于较早的问题解码Google新闻url,我在其中编写了以下函数一个更大的脚本,可以正确解码99%的URL:defdecode_google_url(e):globalfaulty_urlsfa......
  • go对接mqtt
    在Go语言中对接MQTT服务,你可以使用 paho.mqtt.golang 这个库,这是一个EclipsePahoMQTT客户端的Go语言实现。以下是一些基本步骤和示例代码,帮助你开始使用Go语言对接MQTT服务。1. 安装MQTT客户端库:使用Go的包管理器安装 paho.mqtt.golang 库:gogetgithub.com/eclipse/......
  • 【云原生之kubernetes实战】在k8s环境下部署go-file文件分享工具
    【云原生之kubernetes实战】在k8s环境下部署go-file文件分享工具一、go-file介绍1.1go-file简介1.2go-file特点1.3go-file使用场景二、本次实践介绍2.1本次实践简介2.2本次环境规划2.3本次实践存储介绍2.4k8s存储介绍三、检查k8s环境3.1检......
  • Django request.data.get传送列表
    request.data.get('fa_no',[])代码片段通常用于Django处理视图中的传入请求数据。这一行代码试图从请求数据中获取键'fa_no'关联的值。如果在请求数据中未找到'fa_no',它会返回一个默认值空列表([])。以下是每个部分的解释:request:这是HTTP请求对象。data:这个属......
  • Django 自动将作者分配给创建帖子的用户
    我的作者被自动分配时遇到问题,它以前可以工作,但自从我添加了一些内联表单集后就停止工作了-这是我的模型:classRecipe(models.Model):title=models.CharField(max_length=100)description=models.TextField()author=models.ForeignKey(User,on_delet......
  • Django DRF安装设置 序列化器ModelSerializer 视图ModelViewSet 路由url 串讲
    在DjangoRESTFramework(DRF)中,重新编写API视图通常涉及几个步骤。以下是一个简单的示例,展示如何定义和注册视图集、序列化器和路由,以便你可以创建、读取、更新和删除(CRUD)数据。1.定义序列化器#serializers.pyfromrest_frameworkimportserializersfrom.models......
  • Django 你不知道的filterset_fields和filter_fields区别
    filter_fields和filterset_fields是DjangoRESTframework(DRF)中用于过滤的两个不同概念:filter_fields定义:在DRF的ModelViewSet中,filter_fields允许你指定可用于过滤的字段。用法:你可以在视图中设置这个属性,来指定哪些字段可以用于过滤。例如,如果你有一个模型......