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.rhkb.cn/news/478723.html

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

相关文章

CSS —— 子绝父相

相对定位:占位;不脱标 绝对定位:不占位;脱标 希望子元素相对于父元素定位,又不希望父元素脱标(父元素占位) 子级是 绝对定位,不会占有位置, 可以放到父盒子里面的任何一…

风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计

风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计 简介 在前端开发的世界里,HTML5和CSS3是构建现代网页的基石。本文将通过一个简单的HTML5页面模板,展示如何使用HTML5的结构化元素和CSS3的样式特性,来创建一个…

django authentication 登录注册

文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前,写了django制作简易登录系统,这次利用django内置的authentication功能实现注册、登录 提示&#xff…

ctfshow单身杯2024wp

文章目录 ctfshow单身杯2024wp签到好玩的PHPezzz_sstiez_inject ctfshow单身杯2024wp 签到好玩的PHP 考点&#xff1a;序列化反序列化 <?phperror_reporting(0);highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public …

ISUP协议视频平台EasyCVR萤石设备视频接入平台银行营业网点安全防范系统解决方案

在金融行业&#xff0c;银行营业厅的安全保卫工作至关重要&#xff0c;它不仅关系到客户资金的安全&#xff0c;也关系到整个银行的信誉和运营效率。随着科技的发展&#xff0c;传统的安全防护措施已经无法满足现代银行对于高效、智能化安全管理的需求。 EasyCVR视频汇聚平台以…

【代码pycharm】动手学深度学习v2-08 线性回归 + 基础优化算法

课程链接 线性回归的从零开始实现 import random import torch from d2l import torch as d2l# 人造数据集 def synthetic_data(w,b,num_examples):Xtorch.normal(0,1,(num_examples,len(w)))ytorch.matmul(X,w)bytorch.normal(0,0.01,y.shape) # 加入噪声return X,y.reshape…

zotero安卓测试版下载和使用

2023年年底&#xff0c;Zotero官方就已经推出了安卓版的测试版Zotero for Android (beta),&#xff0c;但名额有限且只能通过Google商店下载。此外&#xff0c;还有一些第三方开发的安卓应用&#xff0c;如Zoo for Zotero、ZotDroid等。 在首次使用Zotero安卓版时&#xff0c;用…

基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功

基于FPGA的2FSK调制 前言一、2FSK储备知识二、代码分析1.模块分析2.波形分析 总结 前言 设计实现连续相位 2FSK 调制器&#xff0c;2FSK 的两个频率为:fI15KHz&#xff0c;f23KHz&#xff0c;波特率为 1500 bps,比特0映射为f 载波&#xff0c;比特1映射为 载波。 1&#xff09…

Matlab 深度学习 PINN测试与学习

PINN 与传统神经网络的区别 与传统神经网络的不同之处在于&#xff0c;PINN 能够以微分方程形式纳入有关问题的先验专业知识。这些附加信息使 PINN 能够在给定的测量数据之外作出更准确的预测。此外&#xff0c;额外的物理知识还能在存在含噪测量数据的情况下对预测解进行正则…

【JavaScript】JavaScript开篇基础(7)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

JavaScript的基础数据类型

一、JavaScript中的数组 定义 数组是一种特殊的对象&#xff0c;用于存储多个值。在JavaScript中&#xff0c;数组可以包含不同的数据类型&#xff0c;如数字、字符串、对象、甚至其他数组。数组的创建有两种常见方式&#xff1a; 字面量表示法&#xff1a;let fruits [apple…

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议&#xff1a; webSocket协议&#xff1a; 1.2WebSocket协议&#xff1a; 1.3客户端&#xff08;浏览器&#xff09;实现 1.3.2 WebSocket对象的相关事宜&#xff1a; 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…

周志华深度森林deep forest(deep-forest)最新可安装教程,仅需在pycharm中完成,超简单安装教程

1、打开pycharm 没有pycharm的&#xff0c;在站内搜索安装教程即可。 2、点击“文件”“新建项目” 3、创建项目&#xff0c;Python版本中选择Python39。如果没有该版本&#xff0c;选择下面的Python 3.9下载并安装。 4、打开软件包&#xff0c;搜索“deep-forest”软件包&am…

ES 和Kibana-v2 带用户登录验证

1. 前言 ElasticSearch、可视化操作工具Kibana。如果你是Linux centos系统的话&#xff0c;下面的指令可以一路CV完成服务的部署。 2. 服务搭建 2.1. 部署ElasticSearch 拉取docker镜像 docker pull elasticsearch:7.17.21 创建挂载卷目录 mkdir /**/es-data -p mkdir /**/…

分布式kettle调度平台v6.4.0新功能介绍

介绍 Kettle&#xff08;也称为Pentaho Data Integration&#xff09;是一款开源的ETL&#xff08;Extract, Transform, Load&#xff09;工具&#xff0c;由Pentaho&#xff08;现为Hitachi Vantara&#xff09;开发和维护。它提供了一套强大的数据集成和转换功能&#xff0c…

力扣hot100-->排序

排序 1. 56. 合并区间 中等 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输…

.net 8使用hangfire实现库存同步任务

C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…

滑动窗口最大值(java)

题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7]…

springboot项目使用maven打包,第三方jar问题

springboot项目使用maven package打包为可执行jar后&#xff0c;第三方jar会被打包进去吗&#xff1f; 答案是肯定的。做了实验如下&#xff1a; 第三方jar的项目结构及jar包结构如下&#xff1a;&#xff08;该第三方jar采用的是maven工程&#xff0c;打包为普通jar&#xf…

常用Rust日志处理工具教程

在本文中&#xff0c;我想讨论Rust中的日志。通过一些背景信息&#xff0c;我将带您了解两个日志库&#xff1a;env_logger和log4rs。最后&#xff0c;我将分享我的建议和github的片段。 Rust log介绍 log包是Rust中日志API的事实标准&#xff0c;共有五个日志级别&#xff1…