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

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编码,生成最终的哈希值。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式的C/C++:深入理解 static、const 与 volatile 的用法与特点

目录 一、static 1、static 修饰局部变量 2、 static 修饰全局变量 3、static 修饰函数 4、static 修饰类成员 5、小结 二、const 1、const 修饰普通变量 2、const 修饰指针 3、const 修饰函数参数 4. const 修饰函数返回值 5. const 修饰类成员 6. const 与 #defi…

超高流量多级缓存架构设计!

文章内容已经收录在《面试进阶之路》,从原理出发,直击面试难点,实现更高维度的降维打击! 文章目录 电商-多级缓存架构设计多级缓存架构介绍多级缓存请求流程负载均衡算法的选择轮询负载均衡一致性哈希负载均衡算法选择 应用层 Ngi…

【C++ 算法进阶】算法提升二十三

目录 左右数组相减绝对值最大值 (题意代换)题目题目分析 可整合数组 (题意代换)题目题目分析代码 水王问题题目题目分析代码水王问题变形思路讲解 合并石头的最低成本 (动态规划)题目题目分析代码 左右数组…

solr 远程命令执行 (CVE-2019-17558)

漏洞描述 Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目,旨在确保Web应用程序在表示层和业务逻辑层之间的隔离(即MVC设计模式)。 Apa…

idea怎么打开两个窗口,运行两个项目

今天在开发项目的时候,前端希望运行一下以前的项目,于是就需要开两个 idea 窗口,运行两个项目 这里记录一下如何设置:首先依次点击: File -> Settings -> Appearance & Behavior ->System Settings 看到如…

PPT分享 | IBM集团业务流程架构顶层规划-订单到交付-销售到回款方案

PPT下载链接见文末~ IBM业务流程规划方法是一套结构化、体系化的流程设计理论,其企业流程框架(EPF)是一种用于企业业务流程架构设计梳理的方法论。 一、IBM业务流程规划方法的核心 IBM的BPM(业务流程管理)流程管理体…

MySQL闪回恢复:轻松应对数据误删,数据安全有保障

在数据库管理中,数据误删是一个常见且棘手的问题。传统的数据恢复方法可能涉及复杂的操作,如全量备份和增量备份的恢复。MySQL的闪回恢复功能提供了一种更为简便、高效的数据恢复手段。本文将详细介绍MySQL闪回恢复的原理、配置和使用方法,帮…

加菲工具 - 好用免费的在线工具集合

加菲工具 https://orcc.online AI 工具 加菲工具 集合了目前主流的,免费可用的ai工具 文档处理 加菲工具 pdf转word、office与pdf互转等等工具都有链接 图片图标 加菲工具 统计了好用免费的在线工具 编码解码 加菲工具 base64编码解码、url编码解码、md5计算…

uniapp跨域问题解决方案

uniapp跨域问题解决方案 引言 在使用 uni-app 本地开发 H5> 平台时,需要使用浏览器进行调试,而浏览器会有跨域的问题。比如直接通过本地IP地址去访问开发中的页面,同时这个页面会调一些现有的接口时,就面临着跨域的问题。 解决…

ensp静态路由实验

一、实验目的 1、熟练掌握交换机的基本配置命令 2、熟练掌握静态路由的使用方法 3. 熟练掌握交换机端口模式 二、实验内容 需求: 根据要求利用现有实验设备组建小型局域网 实验设备: 交换机S37002台;PC机2台;路由器2台。 …

I2C学习

详情学习 12. I2C通讯 — [野火]Linux基础与应用开发实战指南——基于LubanCat-RK系列板卡 文档 (embedfire.com) I2C总线协议详解(特点、通信过程、典型I2C时序)-CSDN博客 彻底搞懂I2C总线(一)什么是I2C?什么是总线…

Neural Magic 发布 LLM Compressor:提升大模型推理效率的新工具

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

AIGC实战——生成式人工智能总结与展望

AIGC实战——生成式人工智能总结与展望 0. 前言1. 生成式人工智能发展历程1.1 VAE 和 GAN 时代1.2 Transformer 时代1.3 大模型时代 2. 生成式 AI 的当前进展2.1 大语言模型2.2 文本生成代码模型2.3 文本生成图像模型2.4 其他应用 3. 生成式人工智能发展展望3.1 生成式 AI 在工…

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

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

Vue 2.6 中使用 Composition Api 笔记

文章目录 我的开发环境Vue2.6 Composition Api 风格总结获取当前组件的上下文获取路由依赖注入(我的有问题)通过 Vue 上下文获取 其他方法总结路由守卫参考 我的开发环境 我相关依赖的版本是 "vue": "2.6.10", 想要使用 Composi…

✨系统设计时应时刻考虑设计模式基础原则

目录 💫单一职责原则 (Single Responsibility Principle, SRP)💫开放-封闭原则 (Open-Closed Principle, OCP)💫依赖倒转原则 (Dependency Inversion Principle, DIP)💫里氏代换原则 (Liskov Substitution Principle, LSP)&#x…

GoF设计模式——结构型设计模式分析与应用

文章目录 UML图的结构主要表现为:继承(抽象)、关联 、组合或聚合 的三种关系。1. 继承(抽象,泛化关系)2. 关联3. 组合/聚合各种可能的配合:1. 关联后抽象2. 关联的集合3. 组合接口4. 递归聚合接…

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

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

Windows系统电脑安装TightVNC服务端结合内网穿透实现异地远程桌面

文章目录 前言1. 安装TightVNC服务端2. 局域网VNC远程测试3. Win安装Cpolar工具4. 配置VNC远程地址5. VNC远程桌面连接6. 固定VNC远程地址7. 固定VNC地址测试 前言 在追求高效、便捷的数字化办公与生活的今天&#xff0c;远程桌面服务成为了连接不同地点、不同设备之间的重要桥…

IDEA2019搭建Springboot项目基于java1.8 解决Spring Initializr无法创建jdk1.8项目 注释乱码

后端界面搭建 将 https://start.spring.io/ 替换https://start.aliyun.com/ 报错 打开设置 修改如下在这里插入代码片 按此方法无果 翻阅治疗后得知 IDEA2019无法按照网上教程修改此问题因此更新最新idea2024或利用插件Alibaba Clouod Toolkit 换用IDEA2024创建项目 下一步…