Golang 常用的几种密码加密方式

news2024/12/28 4:14:08

加密方式

加密有两种方式,一种是直接加密,一种是盐值加密

**直接加密(Plain Hashing)**指的是将原始密码直接进行加密,而不进行任何额外的操作。这种方式可能存在一些安全风险,因为相同的密码在经过加密后会得到相同的哈希值,容易受到彩虹表攻击等攻击方式的影响。

**盐值加密(Salted Hashing)**则是在进行密码加密之前,将密码与一个随机生成的盐值进行拼接。通过将盐值与密码组合后再进行哈希,可以确保即使密码相同,由于盐值不同,生成的哈希值也会不同。这样可以增加密码的安全性,防止彩虹表攻击等。

为什么被称为盐值?

“盐值”(Salt)一词的使用源自于密码学的术语。在密码学中,"盐"是指一个随机生成的值,用于增加密码哈希函数的安全性。

这个术语的由来是因为盐在密码哈希过程中的作用类似于在烹饪中使用的盐。在烹饪中,盐用于增添食物的味道,并且不同的盐可以带来不同的风味。类比到密码学中,盐用于增加密码的安全性,并且不同的盐可以为相同的密码带来不同的哈希值。

盐值的主要目的是增加密码的破解难度。通过将盐值与密码进行组合后再进行哈希,即使两个用户使用相同的密码,由于盐值不同,最终的哈希值也会不同。这样一来,攻击者无法通过对比哈希值来确定是否存在相同的密码。

另外,使用随机生成的盐值还可以防止预先计算的攻击,例如彩虹表攻击。彩虹表是一种预先计算出密码哈希值与明文密码之间的映射关系的攻击技术,通过事先计算大量密码的哈希值并存储在表中,可以快速地找到对应的明文密码。但是,当使用盐值时,即使明文密码相同,由于盐值不同,生成的哈希值也不同,使得彩虹表攻击无效。

因此,盐值在密码存储和验证过程中起着重要的作用,是一种常见的增强密码安全性的方式之一。

加密方法

1. Bcrypt

Bcrypt 是一个基于 Blowfish 密码哈希函数的密码加密算法。它是一个常见且可靠的选择,具有适度的计算复杂性,可以防止暴力破解和彩虹表攻击。

**Bcrypt 加密函数会自动生成盐值并将其嵌入到生成的哈希值中。**在 Bcrypt 哈希值的格式中,前面部分是一个包含算法标识、盐值和其他必要信息的字符串,后面部分是实际的密码哈希值。

Bcrypt 会自动处理盐值的生成和存储,你不需要显式地提供盐值作为参数。每个密码的盐值都是随机生成的,并且与哈希值一起存储在结果中。这样做的目的是增加密码哈希的安全性,使每个密码都使用不同的盐值进行哈希,即使相同的密码在不同用户之间也会生成不同的哈希值。

因此,**当你使用 Bcrypt 进行密码加密时,你只需要提供密码作为输入,而不需要单独提供盐值。**Bcrypt 会自动为每个密码生成并使用不同的随机盐值。在验证密码时,Bcrypt 会从存储的哈希值中提取盐值,并将其与输入密码一起使用来进行验证。这样,你无需担心盐值的管理和处理,Bcrypt 会为你处理这些细节。

安装

go get -u golang.org/x/crypto/bcrypt

导入包

import "golang.org/x/crypto/bcrypt"

加密

// HashPassword 使用 Bcrypt 算法生成密码哈希值
func HashPassword(password string) (string, error) {
    hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    if err != nil {
        return "", err
    }
    return string(hashedPassword), nil
}

验证

// ComparePasswords 比较输入的密码与哈希值是否匹配
func ComparePasswords(hashedPassword, password string) bool {
    err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
    return err == nil
}

加密验证示例

在这里插入图片描述

在这里插入图片描述

2. Argon2

Argon2 是一个密码哈希函数,被选为 Password Hashing Competition (密码哈希竞赛)的获胜者。它是一个现代的、安全的密码哈希算法,提供了防止侧信道攻击和抵抗 GPU 加速的能力。

Argon2 密码哈希函数将密码加密后的结果通常呈现为乱码。这是因为它们使用了强大的哈希算法和盐值,将密码转换为一个不可逆的哈希值。

这些哈希值通常是二进制数据,不适合直接用于存储或传输。**为了安全地存储和比较密码,你应该将哈希值转换为字符串形式进行存储。**我这里就不写转 base64 格式了,展示一下乱码

安装

go get -u golang.org/x/crypto/argon2

导入包

import "golang.org/x/crypto/argon2"

加密

// HashPassword 使用 Argon2 算法生成密码哈希值
func HashPassword(password, salt string) (string, error) {
	time := uint32(1)           // 迭代次数
	memory := uint32(64 * 1024) // 内存使用量(以字节为单位)
	threads := uint8(4)         // 并行线程数
	keyLen := uint32(32)        // 输出密钥长度为 32 字节
	hashedPassword := argon2.IDKey([]byte(password), []byte(salt), time, memory, threads, keyLen)
	return string(hashedPassword), nil
}

验证

验证使用 Go 语言标准库中 crypto/subtle 包中的一个函数ConstantTimeCompare,用于在恒定时间内比较两个字节切片(byte slices)的内容

// ComparePasswords 验证密码是否匹配
func ComparePasswords(hashedPassword, password, salt string) bool {
	time := uint32(1)           // 迭代次数
	memory := uint32(64 * 1024) // 内存使用量(以字节为单位)
	threads := uint8(4)         // 并行线程数
	keyLen := uint32(32)        // 输出密钥长度为 32 字节
	derivedKey := argon2.IDKey([]byte(password), []byte(salt), time, memory, threads, keyLen)
	return subtle.ConstantTimeCompare([]byte(hashedPassword), derivedKey) == 1
}

加密验证示例

在这里插入图片描述

在这里插入图片描述

3. Scrypt

Scrypt 是一种基于密码学的 key-derivation function(密钥派生函数),主要用于密码加密和密钥衍生。它相对于一些其他算法,如 MD5 和 SHA-2,具有更高的计算复杂性。

Scrypt 密码哈希函数将密码加密后的结果通常呈现为乱码。这是因为它们使用了强大的哈希算法和盐值,将密码转换为一个不可逆的哈希值。

这些哈希值通常是二进制数据,不适合直接用于存储或传输。**为了安全地存储和比较密码,你应该将哈希值转换为字符串形式进行存储。**我这里就不写转 base64 格式了,展示一下乱码

安装

go get -u golang.org/x/crypto/scrypt

导入包

import "golang.org/x/crypto/scrypt"

加密

// HashPassword 使用 Scrypt 算法生成密码哈希值
func HashPassword(password, salt string) (string, error) {
	N := 16384   // 迭代次数,表示对哈希函数的重复计算次数。值越大,计算成本越高,安全性越好,但性能也会受到影响。通常建议选择一个大于 2^14 的值,例如 16384
	r := 8       // 块大小,表示每次哈希计算中使用的内存块大小。较大的值会增加内存消耗,并增加攻击成本。通常建议选择一个合适的值,例如 8
	p := 1       // 并行度,表示并行计算的线程或处理器数目。较高的值会增加计算成本,适当的值取决于你的硬件配置。通常建议选择一个合适的值,例如 1
	keyLen := 32 // 参数指定生成的密钥的长度
	hashedPassword, err := scrypt.Key([]byte(password), []byte(salt), N, r, p, keyLen)
	if err != nil {
		return "", err
	}
	return string(hashedPassword), nil
}

验证

验证使用 Go 语言标准库中 crypto/subtle 包中的一个函数ConstantTimeCompare,用于在恒定时间内比较两个字节切片(byte slices)的内容

// ComparePasswords 验证密码是否匹配
func ComparePasswords(hashedPassword, password, salt string) bool {
	N := 16384   // 迭代次数,表示对哈希函数的重复计算次数。值越大,计算成本越高,安全性越好,但性能也会受到影响。通常建议选择一个大于 2^14 的值,例如 16384
	r := 8       // 块大小,表示每次哈希计算中使用的内存块大小。较大的值会增加内存消耗,并增加攻击成本。通常建议选择一个合适的值,例如 8
	p := 1       // 并行度,表示并行计算的线程或处理器数目。较高的值会增加计算成本,适当的值取决于你的硬件配置。通常建议选择一个合适的值,例如 1
	keyLen := 32 // 参数指定生成的密钥的长度
	derivedKey, err := scrypt.Key([]byte(password), []byte(salt), N, r, p, keyLen)
	if err != nil {
		return false
	}
	return subtle.ConstantTimeCompare([]byte(hashedPassword), derivedKey) == 1
}

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F4X DMA

STM32F4X DMA 什么是DMASTM32F4X DMADMA框图DMA通道DMA仲裁器DMA FIFO DMA传输模式DMA传输方向存储器到存储器存储器到外设外设到存储器 DMA循环模式和普通模式循环模式(Circular)普通模式(Normal) DMA源、目标寄存器增量模式DMA例…

一文简介,数字时代的数据交易模式

在数字时代,数据作重要的信息和资源,未来获得更高质量的数据资源,数据交易越来越常见,数据也成为企业重要的无形资产。 2022年3月出台的《中共中央、国务院关于加快建设全国统一大市场的意见》强调要加快培育数据要素市场&#xf…

Zabbix登录绕过漏洞复现(CVE-2022-23131)

0x00 前言 最近在复现zabbix的漏洞(CVE-2022-23131),偶然间拿到了国外某公司zabbix服务器。Zabbix Sia Zabbix是拉脱维亚Zabbix SIA(Zabbix Sia)公司的一套开源的监控系统。该系统支持网络监控、服务器监控、云监控和…

Jetpack Compose 1.5 发布:全新 Modifier 系统助力性能提升

不久前 Compose 1.5.0 稳定版发布,在组合的性能方面得到明显改善,这主要归功于对 Modifier API 的持续重构。 Modifier 是 Compose 中的重要概念,为 Composition 中的 LayoutNode 配置各种样式信息以用于后续渲染。在 1.3.0 之前的 Modifier …

Java知识点二

Java知识点二 1、Comparable内部比较器,Comparator外部比较器2、源码结构的区别:1)Comparable接口:2)Comparator接口: 2、Java反射 1、Comparable内部比较器,Comparator外部比较器 我们一般把Comparable叫…

【MySQL】表的增删改查

目录 MySQL表的增删查改 Create 单行数据全列插入 多行数据指定列插入 插入否则更新 替换数据 Retrieve SELECT 列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 WHERE 条件 查询英语不及格的同学及其英语成绩 查询语文成绩在80到90分的…

【自动化测试】如何在jenkins中搭建allure

相信大家在做自动化测试过程中,都会用到自动化测试环境,目前最常见的就是通过容器化方式部署自动化测试环境,但对于一些测试小白,不是很会搭建持续集成环境,特别是从0-1的过程,需要自行搭建很多依赖环境&am…

完全保密的以太坊交易:Aztec网络的隐私架构

1. 引言 Aztec为隐私优先的以太坊zkRollup:即其为具有完全隐私保护的L2。 为了理解私有交易的范式变化性质,以及为什么将隐私直接构建到网络架构中很重要,必须首先讨论为什么以太坊不是私有的。 2. 以太坊:公有链 以太坊为具有…

设计师常用的8款作图软件推荐

在数字时代,绘图软件已经成为设计师不可缺少的工具。从图形设计到插图,从传统绘图到人工智能绘画,为了实现高效、方便、创意的设计,设计师需要一个强大的绘图软件。本文将介绍8个易于使用的绘图软件,每个软件都具有独特…

ME51N 采购申请屏幕增强仅显示字段

1、业务需求 通过委外工单生成的采购申请,需要将自定义“图号”字段显示在采购申请中,且只用于显示即可 2、增强实现 增强表EBAN的结构CI_EBANDB 增强点CMOD:MEREQ001 出口EXIT_SAPLMEREQ_001 首先在TOP文件中引入全局CI_EBANDB 创建子屏…

动态渲染 echarts 饼图(vue 2 + axios + Springboot)

目录 前言1. 项目搭建1.1. 前端1.2. 后端 2. 后端数据渲染前端2.1 补充1:在 vue 中使用 axios2.2. 补充2:Springboot 处理跨域问题2.3. 修改前端代码2.3.1 修改饼图样式2.3.2 调用后台数据渲染饼图2.3.3 改造成内外两个圈 前言 因为上文中提到的需求就是…

轻松上手Three.js:JavaScript 3D库指南

1.Three.js概述 Three.js是使用JavaScript语言编写的一款运行在浏览器中的3D引擎。与WebGL不同,开发人员在使用Three.js进行开发时,无须掌握高深的图形学知识,只需使用少量JavaScript代码即可创建出一个3D场景。可以说,Three.js的…

恒运资本:小盘股的优点?投资小盘股要注意哪些方面?

股市是一个充溢时机和危险的当地,不同出资者有不同的偏好,有的人喜爱追逐大盘蓝筹股,有的人则钟情于小盘股。那么小盘股的长处?出资小盘股要注意哪些方面?恒运资本也为我们准备了相关内容,以供参考。 小盘股…

vue+springboot+mysql的垃圾分类管理系统

1、引言 设计结课作业,课程设计无处下手,网页要求的总数量太多?没有合适的模板?数据库,java,python,vue,html作业复杂工程量过大?毕设毫无头绪等等一系列问题。你想要解决的问题&am…

六、Hive数据仓库应用之Hive事务(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)

Hive远程模式部署参考: 一、Hive数据仓库应用之Hive部署(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7) 文章目录 一、事务的设计与特点1、事务的特点2、事务的设计3、事务的实现 二、…

【LeetCode刷题笔记】动态规划 — 70.爬楼梯

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

Python不是一种伟大的编程语言?

作为一门简洁易用、生态蓬勃且具有高泛用性的编程语言&#xff0c;Python一直以来都被不少人称作“编程语言中的瑞士军刀”。 尤其随着近来AI热潮席卷全球&#xff0c;Python在编程语言圈中的地位也随之水涨船高&#xff0c;甚至一度被视作AI专用语言或大数据专用语言。 然而…

Netty核心原理:一、基础入门-04:NettyServer字符串解码器

文章目录 一、前言介绍二、代码实现2.1 工程结构2.2 Netty服务端字符串解码器实现2.2.1 服务端处理器2.2.2 通道初始化2.2.3 netty服务端 2.3 单元测试 一、前言介绍 &#x1f4a1; 服务端接收数据后我们希望是一个字符串或者是一个对象类型,而不是字节码。 在 netty 中是否可以…

数据结构与算法基础-学习-33-归并排序

目录 一、基本思想 二、算法思路 1、合并两个有序序列 2、分治法 三、算法源码 1、MergeSortTwoSortData 2、TwoWayMergeSortRecurtionSentryQueue 四、算法效率分析 五、Linux环境编译测试 六、小感慨 排序的其他相关知识点和源码分享可以参考之前的博客&#xff1a…

解决 Android 依赖冲突

解决办法 问题原因就是&#xff0c;各个模块所有的依赖&#xff08;递归&#xff09;的 jar 包最后都会加载到安卓的项目中&#xff0c;你可以选择 project 形式查看 External Libraries&#xff0c;都在这了。所以解决问题关键就是干掉冲突&#xff0c;剩下一个就行了&#xf…