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

news2024/11/26 17:48:52

1.实例测试

package main

import (
	"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.coloradmin.cn/o/2247971.html

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

相关文章

卷积神经网络学习记录

目录 神经网络基础定义: 基本组成部分 工作流程 卷积层(卷积定义)【CONV】: 卷积层(Convolutional Layer) 特征提取:卷积层的主要作用是通过卷积核(或滤波器)运算提…

Java安全—JNDI注入RMI服务LDAP服务JDK绕过

前言 上次讲到JNDI注入这个玩意,但是没有细讲,现在就给它详细地讲个明白。 JNDI注入 那什么是JNDI注入呢,JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口&…

设计模式之 模板方法模式

模板方法模式是行为型设计模式的一种。它定义了一个算法的骨架,并将某些步骤的实现延迟到子类中。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。 模板方法模式的核心在于: 封装算法的骨架:通过父类中的模板方…

学习threejs,使用设置bumpMap凹凸贴图创建褶皱,实现贴图厚度效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshPhongMaterial高…

日常开发记录-正确的prop传参,reduce搭配promise的使用

日常开发记录-正确的prop传参&#xff0c;reduce搭配promise的使用 1.正确的prop传参2.reduce搭配promise的使用 1.正确的prop传参 一般会的父组件传参子组件 //父组件 <A :demodata.sync"testData" :listData.sync"testData2"></A> data ()…

RedHat 10 Beta Install

RedHat 10 beta 前言 Red Hat Enterprise Linux 10.0 Beta 附带内核版本 6.11.0,该版本为以下架构提供最低要求版本支持(括号中注明) AMD 和 Intel 64 位架构(x86-64-v3)64 位 ARM 架构(ARMv8.0-A)IBM Power Systems,小端(POWER9)64 位 IBM Z (z14)RHEL 安装程序的主…

泥石流灾害风险评估与模拟丨AI与R语言、ArcGIS、HECRAS融合,提升泥石流灾害风险预测的精度和准确性

目录 第一章 理论基础 第二章 泥石流风险评估工具 第三章 数据准备与因子提取 第四章 泥石流灾害评价 第五章 HECRAS软件的应用 第六章 操作注意事项与模型优化 泥石流灾害的频发与严重后果&#xff0c;已成为全球范围内防灾减灾工作的重大挑战。随着科技的不断进步&…

android 音效可视化--Visualizer

Visualizer 是使应用程序能够检索当前播放音频的一部分以进行可视化。它不是录音接口&#xff0c;仅返回部分低质量的音频内容。但是&#xff0c;为了保护某些音频数据的隐私&#xff0c;使用 Visualizer 需要 android.permission.RECORD_AUDIO权限。传递给构造函数的音频会话 …

汽车HiL测试:利用TS-GNSS模拟器掌握硬件性能的仿真艺术

一、汽车HiL测试的概念 硬件在环&#xff08;Hardware-in-the-Loop&#xff0c;简称HiL&#xff09;仿真测试&#xff0c;是模型基于设计&#xff08;Model-Based Design&#xff0c;简称MBD&#xff09;验证流程中的一个关键环节。该步骤至关重要&#xff0c;因为它整合了实际…

基于Boost库的搜索引擎

本专栏内容为&#xff1a;项目专栏 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;基于Boots的搜索引擎 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识…

二叉树oj题解析

二叉树 二叉树的最近公共祖先什么是最近公共祖先&#xff1f;leetcode中求二叉树中最近公共祖先解题1.解题2. 根据二叉树创建字符串 二叉树的最近公共祖先 什么是最近公共祖先&#xff1f; 最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节…

AI赋能电商:构建高效、智能化的新零售生态

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;其在电商领域的应用日益广泛&#xff0c;从购物推荐到供应链管理&#xff0c;再到商品定价&#xff0c;AI正在全面改变传统电商的运营模式&#xff0c;并推动行业向智能化和精细化方向发展。本文将探讨如何利…

【从零开始的LeetCode-算法】43. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…

【数据结构】树——链式存储二叉树的基础

写在前面 书接上文&#xff1a;【数据结构】树——顺序存储二叉树 本篇笔记主要讲解链式存储二叉树的主要思想、如何访问每个结点、结点之间的关联、如何递归查找每个结点&#xff0c;为后续更高级的树形结构打下基础。不了解树的小伙伴可以查看上文 文章目录 写在前面 一、链…

泷羽sec-linux

基础之linux 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

重新定义社媒引流:AI社媒引流王如何为品牌赋能?

在社交媒体高度竞争的时代&#xff0c;引流已经不再是单纯追求流量的数字游戏&#xff0c;而是要找到“对的用户”&#xff0c;并与他们建立真实的连接。AI社媒引流王通过技术创新和智能策略&#xff0c;重新定义了社媒引流的方式&#xff0c;帮助品牌在精准触达和高效互动中脱…

centos 服务器 docker 使用代理

宿主机使用代理 在宿主机的全局配置文件中添加代理信息 vim /etc/profile export http_proxyhttp://127.0.0.1:7897 export https_proxyhttp://127.0.0.1:7897 export no_proxy"localhost,127.0.0.1,::1,172.171.0.0" docker 命令使用代理 例如我想在使用使用 do…

WebRTC音视频同步原理与实现详解(上)

第一章、RTP时间戳与NTP时间戳 1.1 RTP时间戳 时间戳&#xff0c;用来定义媒体负载数据的采样时刻&#xff0c;从单调线性递增的时钟中获取&#xff0c;时钟的精度由 RTP 负载数据的采样频率决定。 音频和视频的采样频率是不一样的&#xff0c;一般音频的采样频率有 8KHz、…

Matlab 深度学习工具箱 案例学习与测试————求二阶微分方程

clc clear% 定义输入变量 x linspace(0,2,10000);% 定义网络的层参数 inputSize 1; layers [featureInputLayer(inputSize,Normalization"none")fullyConnectedLayer(10)sigmoidLayerfullyConnectedLayer(1)sigmoidLayer]; % 创建网络 net dlnetwork(layers);% 训…

互联网直播/点播EasyDSS视频推拉流平台视频点播有哪些技术特点?

在数字化时代&#xff0c;视频点播应用已经成为我们生活中不可或缺的一部分。监控技术与视频点播的结合正悄然改变着我们获取和享受媒体内容的方式。这一变革不仅体现在技术层面的进步&#xff0c;更深刻地影响了我们。 EasyDSS视频直播点播平台是一款高性能流媒体服务软件。E…