Go 使用bcrypt实现密码加密和和校验

在Go语言中,使用bcrypt算法进行密码的加密和校验是一种常见的做法,因为bcrypt算法可以提供强大的密码安全性。

 bcrypt可以用于数据库中的用户密码保存,相比md5而言更加的安全可靠

文档

  • https://pkg.go.dev/golang.org/x/crypto/bcrypt

文档上给出了标准文档,这个库是下面这个文件描述的算法golang实现:

  • https://www.usenix.org/legacy/event/usenix99/provos/provos.pdf

安装

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

 案例:多次运行后,生成的结果是不一样的

package mainimport ("fmt""golang.org/x/crypto/bcrypt"
)func main() {password := "123qwe"hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)fmt.Println(string(hashedPassword))
}

 案例二:bcrypt不能解密,不过可以比较加密后的数据和加密前的数据是否相匹配 

package mainimport ("fmt""golang.org/x/crypto/bcrypt"
)func main() {password := "123qwe"hashedPassword, err := GenerateFromPassword(password)if err != nil {fmt.Println("加密失败")}if CompareHashAndPassword(hashedPassword, password) {fmt.Println("密码匹配")} else {fmt.Println("密码不匹配")}
}// GenerateFromPassword 加密
func GenerateFromPassword(password string) (string, error) {hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)if err != nil {return "", err}return string(hashedPassword), err
}// CompareHashAndPassword 比较加密后的数据和加密前的数据是否相匹配
func CompareHashAndPassword(hashPassword string, password string) bool {err := bcrypt.CompareHashAndPassword([]byte(hashPassword), []byte(password))return err == nil
}

案例三:

package mainimport ("fmt""golang.org/x/crypto/bcrypt"
)func HashPassword(password string) (string, error) {bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)return string(bytes), err
}
func CheckPasswordHash(password, hash string) bool {err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))return err == nil
}
func main() {password := "123qwe"hash, _ := HashPassword(password) // 为了简单忽略错误处理fmt.Println("Password:", password)fmt.Println("Hash:    ", hash)match := CheckPasswordHash(password, hash)fmt.Println("Match:   ", match)
}

注意事项

  • 密码加密和校验是用户认证过程中的重要环节,使用bcrypt可以提高安全性。
  • 选择合适的成本因子(cost factor)以平衡安全性和性能。
  • 在实际应用中,错误处理是非常重要的,示例代码中为了简单起见忽略了错误处理。
  • 密码加密后存储在数据库中,用户登录时需要进行校验。

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

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

相关文章

SYD881X HID工程重连后连接参数没有更新功耗下不来

SYD881X HID工程重连后连接参数没有更新功耗下不来 现在测试到一个问题,第一次连接上的时候过一段时间功耗会下来到100UA以内,这个是正常的,但是关掉手机蓝牙再打开手机蓝牙就发现功耗是500UA左右下不来了! 抓包发现第一次连接和重连的时候手机给的连接参数是一样的: 问题是当…

电力电子技术03 (1)---电路稳态分析方法

学习来源(只用于个人学习笔记,建议对着老师视频学习理解更深入):2.2稳态分析的基本方法_哔哩哔哩_bilibili 一、Buck降压电路 Buck电路,也称为降压转换器,是一种DC-DC电压转换器,用于将输入电…

PHP精度处理

一、问题缘由 PHP 服务接收前端传过来的单价(字符串形式)和数量,把单价转成分(单价*100),然后传给下游的 Golang 服务,不过最后从两个服务日志中发现金额相差 1。 以下为前端传的 {"amount": 4,"price": "9.2&qu…

代码随想录算法训练营第四十六天||139.单词拆分

一、139.单词拆分 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s …

python下将sqlite数据提取出来,转化为json数据

问题描述:我需要将sqlite数据提取出来做一部分处理,使用pandas,sqlite3库实现 大致的思路:使用sqlite3读取指定路径的数据,然后使用pandas.read_sql_query接收数据,然后to_dict,再写入到json文件…

【强训笔记】day25

NO.1 思路&#xff1a;哈希质数判断。 代码实现&#xff1a; #include <iostream> #include<string> #include<cmath> using namespace std;bool isprime(int n) {if(n<2) return false;for(int i2;i<sqrt(n);i){if(n%i0) return false;}return true…

Vscode行尾序列LF和CRLF

提交代码时要注意&#xff1a; LF: line feed 代表换行 \n CRLF: carriage return line feed 代表回车并换行 \r\n (window系统下的换行) LF (Line Feed): 缩写&#xff1a;LF 字符&#xff1a;\n 描述&#xff1a;在Unix和Unix-like系统&#xff08;如Linux和macOS&#xf…

关于DOS

磁盘操作系统&#xff0c;Disk Operating System&#xff0c;属于单用户单任务操作系统&#xff0c;一次只能执行一个任务。一次只能执行一个任务。DOS操作系统是通过输入命令来执行一些操作。DOS已退出市场&#xff0c;WinNT/2K/XP中有个叫“命令提示符”&#xff08;CMD&…

2024-5-28 石群电路-16

2024-5-28&#xff0c;星期二&#xff0c;20:14&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天没有什么特别的事情发生&#xff0c;不过返校假期已经开始啦&#xff0c;和女朋友逛了街&#xff0c;吃了好吃的&#xff0c;学习也当然不能落下啦&#xff0…

Qt 自定义代理类

一.使用步骤 继承QStyledItemDelegate类&#xff1a;首先创建一个新的类并继承自QStyledItemDelegate类&#xff0c;作为您的自定义代理类。 实现代理类的构造函数&#xff1a;在代理类中实现构造函数&#xff0c;并在构造函数中调用基类的构造函数&#xff0c;可以选择传入一…

BIO/NIO学习

在传送文件的时候常常出现这么一个问题&#xff0c;就是当客户端的文件全部传送完了之后&#xff0c;服务器没有接收到客户端那边传过的停止信号&#xff0c;所以服务器也就跟着客户端停止运行了&#xff0c;我们可以使用 try {socket.shutdownOutput();} catch (IOException e…

web前端之vue动态访问静态资源、静态资源的动态访问、打包、public、import、URL、Vite

MENU 静态资源与打包规则动态访问静态资源直接导入将静态资存放在public目录中动态导入URL构造函数结束语实践与坑附文 静态资源与打包规则 介绍 Vite脚手架在打包代码的时候&#xff0c;会把源代码里对于静态资源的访问路径转换为打包后静态资源文件的路径。主要的区别是文件指…

ROS 话题通信(C++)

ROS 话题通信&#xff08;C&#xff09; 话题并不只属于发布者或订阅者,而是由ROS系统创建管理的,只要节点向NodeHandle大管家提出的话题发布需求或者话题订阅需求,这个话题就会自动被创建 这段话的核心是解释ROS&#xff08;Robot Operating System&#xff09;中话题&#xf…

go-gin中session实现redis前缀和db库选择+单点登录

分别实现了redigo中自动加前缀和session中自动加前缀 等有空了整理一个demo放到github上&#xff0c;到时候求个小星星 在gin-contrib/sessions/redis库中redis的前缀是被封装起来了&#xff0c;所以自定义前缀没有内部方法在这里我们自己实现一下NewStoreWithDBPrefix方法配…

记录一次开源 MaxKey 安装部署

官方文档&#xff1a;https://www.maxkey.top/doc/docs/intro/ 开源代码&#xff1a;https://toscode.mulanos.cn/dromara/MaxKey 发行版&#xff1a;https://toscode.mulanos.cn/dromara/MaxKey/releases 一、准备工作 yum install -y yum-utils yum-config-manager --add-r…

SwiftUI初探

SwiftUI 虽然出现了好几年(1.0好像2019年出的&#xff0c;还有SPM也是同一年)&#xff0c;现在已经到从1.0到5.0&#xff0c;但受限于对系统的要求(最低iOS13.0,有的要求17.0及以上)&#xff0c;每个版本里面差异也很大&#xff0c;语法和Flutter 的Dart 比较像。空闲之余可以先…

谈谈什么是生成器,它与列表推导式有何区别?以及如何使用Python进行异常处理?

生成器&#xff08;Generator&#xff09;是一种特殊的函数&#xff0c;它一次生成一个值&#xff0c;而不是一次性生成所有值。可以将其视为可恢复函数&#xff0c;在函数执行过程中&#xff0c;yield语句会返回需要的值给调用生成器的地方&#xff0c;然后退出函数。下一次调…

linux定时删除历史日志

在Linux系统中&#xff0c;日志文件是记录系统、应用程序或服务的运行信息、错误消息和警告的重要工具。然而&#xff0c;随着时间的推移&#xff0c;这些日志文件会不断积累&#xff0c;占用大量的磁盘空间。如果不及时清理&#xff0c;可能会导致磁盘空间不足&#xff0c;从而…

5、sqlmap注入post类型+os-shell

题目&#xff1a;青少年&#xff1a;Easy_SQLi 1、打开网页&#xff0c;是一个登入表单 2、判断注入类型&#xff0c;是一个字符注入&#xff0c;使用or直接绕过密码进去了 3、上bp抓取数据包&#xff0c;sqlmmap用post注入走一遍&#xff0c;找到数据库&#xff0c;账号密码&…

如何制定一个有效的现货黄金投资策略(EEtrade)

制定一个有效的现货黄金投资策略涉及多方面的考量。以下是几个步骤和考虑因素&#xff0c;可以帮助您建立一个坚实的投资策略&#xff1a; 1. 设立清晰的投资目标 决定您投资现货黄金的主要目的。是否是为了短期利润&#xff0c;长期保值增值&#xff0c;还是为了投资组合的多…