1-golang_org_x_crypto_bcrypt测试 --go开源库测试

1.实例测试

package mainimport ("fmt""golang.org/x/crypto/bcrypt"
)func main() {password := []byte("mysecretpassword")hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)if err != nil {fmt.Println(err)}fmt.Println(string(hashedPassword))err = bcrypt.CompareHashAndPassword(hashedPassword, []byte("mysecretpassword"))if err != nil {fmt.Println("密码错误")} else {fmt.Println("密码正确")}
}

在这里插入图片描述

2.代码解读

a.main函数开始解读

// 这段Go代码的主要功能是生成并验证一个密码的哈希值:1. 生成哈希值:使用 bcrypt.GenerateFromPassword 函数将明文密码转换为哈希值。
2. 打印哈希值:将生成的哈希值打印到控制台。
3. 验证密码:使用 bcrypt.CompareHashAndPassword 函数将生成的哈希值与明文密码进行比对,验证密码是否正确,并输出相应的结果。// 按住ctrl键,点击 GenerateFromPassword 函数代码

在这里插入图片描述

b.查看函数 GenerateFromPassword

// 这段 Go 代码定义了一个名为 GenerateFromPassword 的函数,用于生成密码哈希。具体功能如下:1. 检查输入的密码长度是否超过 72 字节,如果超过则返回错误 ErrPasswordTooLong。
2. 调用 newFromPassword 函数生成一个哈希对象,如果生成过程中出现错误,则返回该错误。
3. 返回生成的哈希值。

在这里插入图片描述

c.查看函数 newFromPassword

// 这段Go代码定义了一个名为 newFromPassword 的函数,用于从给定的密码生成一个哈希对象。具体步骤如下:1. 检查并设置成本参数 cost,如果 cost 小于最小值 MinCost,则设置为默认值 DefaultCost。
2. 创建一个新的 hashed 结构体实例 p,并初始化其版本信息。
3. 验证 cost 是否有效,如果无效则返回错误。
4. 生成一个随机盐值 salt,并进行Base64编码。
5. 使用 bcrypt 算法对密码进行哈希处理,生成哈希值 hash。
6. 将生成的 salt 和 hash 存储在 p 中,并返回 p。

在这里插入图片描述

d.查看函数 Hash

// 这段Go代码定义了一个名为 Hash 的方法,用于生成一个哈希值。具体功能如下:1. 创建一个长度为60的字节切片 arr。
2. 设置 arr[0] 为 $,arr[1] 为 p.major。
3. 如果 p.minor 不为0,则设置 arr[2] 为 p.minor,并将索引 n 增加到34. 设置 arr[n] 为 $,并增加 n。
5. 将 p.cost 格式化为两位数字符串,并复制到 arr[n:] 中,增加 n。
6. 设置 arr[n] 为 $,并增加 n。
7. 将 p.salt 复制到 arr[n:] 中,增加 n。
8. 将 p.hash 复制到 arr[n:] 中,增加 n。
9. 返回 arr 的前 n 个元素。

在这里插入图片描述

e.查看函数 CompareHashAndPassword

// 这段Go代码定义了一个名为 CompareHashAndPassword 的函数,用于比较存储的哈希密码与用户输入的明文密码是否匹配。具体步骤如下:1. 解析哈希密码:通过 newFromHash 函数解析存储的哈希密码,生成一个包含盐值和成本的结构体。
2. 生成新的哈希值:使用相同的盐值和成本对用户输入的明文密码进行哈希处理,生成新的哈希值。
3. 比较哈希值:使用 subtle.ConstantTimeCompare 函数在常量时间内比较两个哈希值是否相等。
4. 返回结果:如果哈希值相等,返回 nil 表示密码匹配;否则返回 ErrMismatchedHashAndPassword 表示密码不匹配。

在这里插入图片描述

f.查看函数 newFromHash

// 这段Go代码定义了一个名为 newFromHash 的函数,用于从已哈希的秘密字符串创建一个 hashed 结构体实例。具体功能如下:1. 检查哈希长度:首先检查传入的 hashedSecret 长度是否小于最小哈希长度 minHashSize,如果是则返回错误 ErrHashTooShort。
2. 初始化结构体:创建一个新的 hashed 结构体实例 p。
3. 解码版本信息:调用 decodeVersion 方法解码版本信息,并更新 hashedSecret。
4. 解码成本信息:调用 decodeCost 方法解码成本信息,并再次更新 hashedSecret。
5. 提取盐值:从 hashedSecret 中提取盐值并存储在 p.salt 中。
6. 提取哈希值:从剩余的 hashedSecret 中提取哈希值并存储在 p.hash 中。
7. 返回结果:返回初始化好的 hashed 结构体实例。

在这里插入图片描述

g.查看函数 bcrypt

// 这段Go代码实现了bcrypt密码哈希算法的核心部分。具体功能如下:1. 初始化密文数据:创建并初始化一个与magicCipherData相同长度的cipherData数组。
2. 设置Blowfish加密:调用expensiveBlowfishSetup函数,根据给定的密码、成本和盐值设置Blowfish加密器。如果设置过程中出现错误,则返回错误。
3. 加密循环:对cipherData的前24个字节进行多次加密操作,每次加密8个字节,共执行64次。
4. 编码结果:将加密后的前23个字节进行Base64编码,生成最终的哈希值。

在这里插入图片描述

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

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

相关文章

【FPGA】Verilog:利用 4 个串行输入- 串行输出的 D 触发器实现 Shift_register

0x00 什么是寄存器 寄存器(Register)是顺序逻辑电路中使用的基本组成部分之一。寄存器用于在数字系统中存储和处理数据。寄存器通常由位(bit)构成,每个位可以存储一个0或1的值。通过寄存器,可以设计出计数器、加法器等各种数据处理电路。 0x01 寄存器的种类 基于 D 触发…

用 Python 从零开始创建神经网络(十):优化器(Optimizers)(持续更新中...)

优化器(Optimizers) 引言1. 随机梯度下降/Stochastic Gradient Descent (SGD)2. 学习率(Learning Rate)3. 学习率衰减(Learning Rate Decay)4. 带动量的随机梯度下降法(Stochastic Gradient Des…

利用c语言详细介绍下栈的实现

数据结构中,栈是一种线性结构,数据元素遵循后进先出的原则。栈的一端为栈顶,一端为栈底或栈尾,数据只在栈顶端进行操作。新插入数据称为入栈或者压栈,删除数据叫做出栈或者退栈。 一、图文介绍 我们通过建立一个stack…

Jackson、Gson、FastJSON三款JSON利器比拼

在Java领域,有多种JSON工具包,比如Jackson、Gson、FastJSON,每家都各有所长,下面我们从性能、特性、生态、易用 性等几个方面来展开下: 一、Jackson 性能 Jackson是一款高性能的JSON处理库。它在序列化和反序列化操作…

使用 OpenCV 进行视频中的行人检测

在计算机视觉领域,行人检测是一个重要的研究方向,它在视频监控、自动驾驶、人机交互等领域都有着广泛的应用。本文将介绍如何使用 OpenCV 库来实现视频中的行人检测。 环境准备 首先,我们需要安装 OpenCV 库。可以通过以下命令来安装&#…

pytest日志总结

pytest日志分为两类: 一、终端(控制台)打印的日志 1、指定-s,脚本中print打印出的信息会显示在终端; 2、pytest打印的summary信息,这部分是pytest 的默认输出(例如测试结果PASSED, FAILED, S…

数据治理:在企业数据管理中的关键角色与实现路径——《DAMA 数据管理知识体系指南》读书笔记- 第 3 章

文章目录 1. 数据治理的核心内涵与战略价值2. 数据治理的驱动因素:不仅仅是合规3. 数据治理的组织模型:选择适合企业结构的运营模式4. 实施数据治理的关键步骤:战略、制度和文化5. 数据治理工具的选择:支持业务与流程的高效管理6.…

candence: 常用的一些命令: Move / Mirror / Rotate / Spain / Fix / unFix / Flipdesign

常用的一些命令 一、 Move 移动 一个可移动一个,也可多个 移动器件 二、 Mirror 镜像 Mirror 就是top 和 bottom 层的器件进行相互转换 三、 Rotate 旋转 移动过程中旋转 四、旋转 Spain 不能在移动中旋转 可以一次旋转一个,也可多个 一次旋转…

【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!

上篇文章:CSDN 我们介绍了JMeter的一些原理介绍,以及安装配置和启动流程,本文我们就来讲讲JMeter如何使用。 一、JMeter目录结构组成 1. 根目录 Jmeter安装包解压后的根目录如下图: 1.1 backups目录:脚本备份目录&am…

MATLAB深度学习(六)——LSTM长短期神经网络原理与应用

LSTM的应用可以参见一个相当好的视频:小车倒立摆最优控制教程 - Part1 Simulink Simscape Multibody仿真建模_哔哩哔哩_bilibili 6.1 序列建模——循环神经网络 循环神经网络RNN是一类专门用于处理序列性数据x,,xn的神经网络结构&#xff0c…

c++趣味编程玩转物联网:树莓派Pico控制 LED点阵屏

88 LED点阵屏是一种常见的数字显示设备,被广泛应用于电子时钟、公交车显示屏和游戏设备中。在本项目中,我们使用树莓派Pico开发板,通过I2C协议驱动HT16K33芯片,实现点阵屏显示心形图案、倒计时、动态矩形和动态圆等内容。本文详细…

transformer.js(四): 模型接口介绍

前面的文章底层架构及性能优化指南介绍了transformer.js的架构和优化策略,在本文中,将详细介绍 transformer.js 的模型接口,帮助你了解如何在 JavaScript 环境中使用这些强大的工具。 推荐阅读 ansformer.js(二)&…

11.25 校内模拟赛总结

难评 复盘 7:40 开题 还是决定采取前期审题时间长一点的策略 T1,显然枚举斜率比较优,算一下复杂度是对的,就会了;T2 好神秘啊,感觉又是什么根据结论然后贪心删数;T3 显然是优化 dp,感觉可做…

学习编程,学习中间件,学习源码的思路

01 看的多,内化不足 最近想复习一下编程相关的知识,在复习前我翻开了之前的一些笔记,这些笔记基本都是从书本、视频、博客等摘取记录的,看着这些笔记心里总结:看的多,内化不足。 02 整理大纲 为了解决这个…

[C++]vector:迭代器失效和vector<string>中更深层次拷贝的问题

迭代器失效 一、迭代器失效的两大类型异地扩容后的失效原地删除后的失效 二、vector<string>出现的深层次拷贝问题 一、迭代器失效的两大类型 异地扩容后的失效 在vector容器中&#xff0c;通常情况下的扩容都是异地扩容&#xff0c;例如resize, reserve&#xff0c;但…

初识 Django

声明 适用于想要快速入门的开发者&#xff0c;有前后端开发以及语言基础&#xff0c;想要学习语法或者特性。 想要学会快速开发&#xff0c;快速入门&#xff0c;请看博客【实用向】Django 框架入门并结合本篇文章。 命令 命令描述startproject创建一个 Django 项目startapp…

.net core MVC入门(一)

文章目录 项目地址一、环境配置1.1 安装EF core需要包1.2 配置数据库连接二、使用EF创建表2.1 整体流程梳理2.1 建表详细流程三、添加第一个视图3.1整体流程梳理3.1 添加视图,并显示在web里四、使用EF增加Catogory数据,并且读取数据到页面4.1整体流程梳理4.2 实现五、增加Cat…

【freertos】FreeRTOS消息队列的介绍与使用

FreeRTOS消息队列的介绍与使用 一、概述二、消息队列的运作机制三、API函数1、消息队列创建函数2、消息队列静态创建函数3、用于向队列尾部发送一个队列消息4、在中断服务程序中用于向队列尾部发送一个消息5、向队列队首发送一个消息6、在中断服务程序中向消息队列队首发送一个…

页的初步认识

关于准备 我们在之前的学习中&#xff0c;已经学习了相当一部分有关段的知识&#xff0c;CPU提供了段的机制来给我们的内存进行保护&#xff0c;但实际上我们在x86下的段base是0&#xff0c;实际上并没有偏移 两种分页模式 我们有两种分页模式&#xff0c;29912分页和101012…

题目一:bugku---game1

2024.11.21 1、题目连接&#xff1a; 2、打开是个小游戏 3、正常玩一把结束后&#xff0c;用bp抓包 4、查看url有三个参数&#xff0c;score对应的就是我们结束这把游戏时获得的分数&#xff0c;sign的zM后面为这把游戏分数的base64加密 5、将抓到的包&#xff0c;发送到重放…