Golang每日一库之bcrypt

这篇具有很好参考价值的文章主要介绍了Golang每日一库之bcrypt。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官方文档: https://pkg.go.dev/golang.org/x/crypto/bcrypt

前言

之前讲过JWT Token https://www.cnblogs.com/zichliang/p/17303759.html JWT呢是信息是经过数字签名的,因此可以被验证和信任。
然后今天就来说说密码学,我们在做鉴权 做用户处理时 会把密码存储到数据库中,但是这个密码我们肯定不能明文去存储,如果这个数据库链接一旦被别人拿到
那后果是不堪设想的。不仅仅是为了防止系统管理员或者DBA等公司人员获得用户的密码,也是防止被黑客拖库产生更大的信息泄露。
如果黑客通过不法手段获取了服务的数据库存储信息,盗取里面的内容,从而直接获得明文密码,那么影响就会很大。
所以我们的密码一般通过几种方式去加密存储

  1. MD5

其实个人觉得MD5加密不太好,因为MD5是不加盐的,虽然是不可逆的,但是黑客其实会针对常见的一些密码,生成彩虹表。
彩虹表是什么呢?
是用于加密散列函数逆运算的预先计算好的表,常用于破解加密过的密码散列(维基百科)
所以相对的感觉安全等级不是很够。

  1. SHA1及其他

SHA-1基于MD5,MD5又基于MD4
SHA-1是由美国标准技术局(NIST)颁布的国家标准,是一种应用最为广泛的Hash函数算法,也是目前最先进的加密技术,被政府部门和私营业主用来处理敏感的信息。
这个缺点个人认为和 MD5一样。

  1. hmacsha

我之前也写过相应的文章[https://www.cnblogs.com/zichliang/p/16653303.html] 里面有相应的hmasha加密
HMAC是密钥相关的哈希运算消息认证码(Hash-basedMessageAuthenticationCode),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
HMAC是需要一个密钥的。所以,HMACSHA1也是需要一个密钥的,而SHA1不需要。

  1. CRC

CRC的全称为CyclicRedundancyCheck,中文名称为循环冗余校验。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。实际上,除数据通信外,CRC在其它很多领域也是大有用武之地的。例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“BadCRC”错误,由此它在数据存储方面的应用可略见一斑。

  1. 还有很多加密方式这里就不一 一赘述了...

本文介绍一种加密方式 bcrypt

概述

bcrypt是一个由美国计算机科学家尼尔斯·普罗沃斯(Niels Provos)以及大卫·马齐耶(David Mazières)根据Blowfish加密算法所设计的密码散列函数,于1999年在USENIX中展示[1]。实现中bcrypt会使用一个加盐的流程以防御彩虹表攻击,同时bcrypt还是适应性函数,它可以借由增加迭代之次数来抵御日益增进的电脑运算能力透过暴力法破解。

由bcrypt加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。然而,所提供的所有字符都具有十分重要的意义。密码越强大,数据就越安全。

除了对数据进行加密,默认情况下,bcrypt在删除数据之前将使用随机数据三次覆盖原始输入文件,以阻挠可能会获得计算机数据的人恢复数据的尝试。如果您不想使用此功能,可设置禁用此功能。

具体来说,bcrypt使用美国密码学家保罗·柯切尔的算法实现。随bcrypt一起发布的源代码对原始版本作了略微改动。

以上内容来自于wiki维基百科 >>>> https://zh.wikipedia.org/wiki/Bcrypt

bcrypt基本介绍

其实简单来说
bcrypt就是一种加盐的单向Hash,不可逆的加密算法,同一种明文(plaintext),每次加密后的密文都不一样,而且不可反向破解生成明文,破解难度很大
而我们熟知的另一种不可逆的加密算法
md5 是不加盐的单向Hash,不可逆的加密算法,同一个密码经过hash的时候生成的是同一个hash值,在大多数的情况下,有些经过md5加密的方法将会被破解。

Bcrypt生成的密文是60位的。而MD5的是32位的。
总的来说,BCrypt比MD5更安全,但加密更慢。
各有优缺点吧。

这里推荐个网站可以完成 bcrypt的加密 我们来尝尝鲜。

https://www.bejson.com/encrypt/bcrpyt_encode/

安装

这里找遍了全网好像也没找到github地址。并且也没有什么安装的教程。

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

cost常量分类

const (
        // 传递给GenerateFromPassword的最小允许开销
	MinCost     int = 4  
        // 传递给GenerateFromPassword的最大允许开销
	MaxCost     int = 31
        // 如果将低于MinCost的cost传递给GenerateFromPassword,则实际设置的cost
	DefaultCost int = 10 
)

使用

这里我们直接看官方写好的测试用例,可能需要 ...(你懂的)
https://cs.opensource.google/go/x/crypto/+/refs/tags/v0.8.0:bcrypt/bcrypt_test.go

GenerateFromPassword 生成一个hash密码

GenerateFromPassword以给定的代价返回密码的bcrypt散列。如果给定的cost小于MinCost,则该cost将被设置为DefaultCost。
GenerateFromPassword不接受长度超过72字节的密码,这是bcrypt操作的最长密码

password, _ := bcrypt.GenerateFromPassword([]byte("123"), bcrypt.DefaultCost)
fmt.Println(string(password))

结果如下
第一次

$2a\(10\)SNRLHrG.ExJHKfR8LihSLOqAJOu/hCpP0ARhwoKvsduxv5xMXkl4u
第二次
$2a\(10\)Np1EBVQ9DZXMvIUkT7Y2P.cA0psEmW2SAVJYcCDqDDN8TsASo7aZm

注: 每次结果都不一样 因为这不是MD5加密,会通过加盐来完成不可逆的加密

Cost方法 返回给定的cost

Cost返回用于创建给定散列密码的散列成本。将来,当密码系统的哈希成本需要增加以适应更大的计算能力时,这个功能允许人们确定需要更新哪些密码。
简单来说 返回上文的 bcrypt.DefaultCost

cost, _ := bcrypt.Cost([]byte("$2a$10$XgLBtSfJsrBd.liLOYWddOYWYWboBUAlKmivcSwq647C3vTNUOVMO"))
fmt.Println(cost)

结果如下

10

CompareHashAndPassword 对比明文密码和散列密码

CompareHashAndPassword,将返回的散列密码与其明文版本进行比较。

password, _ := bcrypt.GenerateFromPassword([]byte("123"), bcrypt.DefaultCost)
fmt.Println(string(password))

// 可以解析出上文
cost, _ := bcrypt.Cost([]byte("$2a$10$XgLBtSfJsrBd.liLOYWddOYWYWboBUAlKmivcSwq647C3vTNUOVMO"))
fmt.Println(cost)

err := bcrypt.CompareHashAndPassword(password, []byte("123"))
if err != nil {
	fmt.Println("密码验证错误", err)
}
fmt.Println("密码验证成功>>>", nil)

结果

$2a\(10\)ANuBn8FthHbgfYir4v65AOvdtqoR3xjZ0G8duN5ynH1Vm0h3yUF/G
10
密码验证成功>>>

调用utils文件 —— 集成版

package utils

import (
	"golang.org/x/crypto/bcrypt"
)

func Encrypt(encryptText string) (string, error) {
	hashStr, err := bcrypt.GenerateFromPassword([]byte(encryptText), bcrypt.DefaultCost)
	if err != nil {
		return "", err
	}
	return string(hashStr), err
}

func CompareHashAndPassword(hashPassword, Password string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(hashPassword), []byte(Password))

	return err == nil
}

bcrypt某些错误类型

  • type HashVersionTooNewError byte

使用 创建哈希时从 CompareHashAndPassword 返回的错误 比此实现更新的 bcrypt 算法。
func (hv HashVersionTooNewError) Error() string 调用error返回字符串

  • type InvalidCostError int

类型 无效cost错误
func (ic InvalidCostError) Error() string 调用error返回字符串

  • type InvalidHashPrefixError byte

类型无效哈希前缀错误
当哈希以“$”以外的内容开头时,从 CompareHashAndPassword 返回的错误
func (ih InvalidHashPrefixError) Error() string 调用error返回字符串文章来源地址https://www.toymoban.com/news/detail-427157.html

到了这里,关于Golang每日一库之bcrypt的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每日一库:pprof简介

    pprof 是Go语言的一个性能分析库,它可以帮助开发者找出程序中的性能瓶颈。 pprof 提供了CPU分析、内存分析、阻塞分析等多种性能分析功能。 以下是 pprof 的主要特性: CPU分析 : pprof 可以记录程序在CPU上的运行时间,并将这些数据以火焰图的形式展示出来。这可以帮助开发

    2024年02月10日
    浏览(77)
  • 每日一库:cobra 简介

    当你需要为你的 Go 项目创建一个强大的命令行工具时,你可能会遇到许多挑战,比如如何定义命令、标志和参数,如何生成详细的帮助文档,如何支持子命令等等。为了解决这些问题, github.com/spf13/cobra 就可以派上用场。 github.com/spf13/cobra 是一个用于构建强大的命令行应用程

    2024年02月08日
    浏览(40)
  • 每日一库:fsnotify简介

    fsnotify 是一个用Go编写的文件系统通知库。它提供了一种观察文件系统变化的机制,例如文件的创建、修改、删除、重命名和权限修改。它使用特定平台的事件通知API,例如Linux上的inotify,macOS上的FSEvents,以及Windows上的ReadDirectoryChangesW。 fsnotify 具有以下特点: 跨平台支持

    2024年02月11日
    浏览(31)
  • 每日一库:Prometheus

    Prometheus 是一个开源的系统监控和警报工具,最初由 SoundCloud 开发,并于 2012 年发布为开源项目。它是一个非常强大和灵活的工具,用于监控应用程序和系统的性能,并根据预定义的规则触发警报。以下是对 Prometheus 的详细介绍: 多维数据模型: Prometheus 使用多维数据模型来

    2024年02月08日
    浏览(71)
  • 每日一库:gosec

    gosec 是一个用于在 Go 代码中查找安全问题的开源工具,它可以帮助发现可能的漏洞和潜在的安全风险。以下是关于 gosec 的详细介绍: gosec 是一个静态分析工具,用于扫描 Go 代码以查找潜在的安全问题。它可以识别常见的代码漏洞、敏感信息泄露和其他安全问题,帮助开发人

    2024年02月12日
    浏览(33)
  • 每日一库:lumberjack -- 日志轮换和管理

    在开发应用程序时,记录日志是一项关键的任务,以便在应用程序运行时追踪问题、监视性能和保留审计记录。Go 语言提供了灵活且强大的日志记录功能,可以通过多种方式配置和使用。其中一个常用的日志记录库是 github.com/natefinch/lumberjack ,它提供了一个方便的方式来处理

    2024年02月08日
    浏览(36)
  • Golang标准库之bytes介绍

    本次主要介绍golang中的标准库 bytes ,基本上参考了 字节 | bytes 、Golang标准库——bytes 文章。 bytes 库主要包含 5 大部分,即: 常量 变量 函数 Buffer Reader 我们依次学习上面的 5 大部分。 bytes.MinRead 是一个常量,表示在使用 ReadFrom 方法从 io.Reader 中读取数据时,每次读取的最小

    2024年02月07日
    浏览(48)
  • golang常用库之-golang-jwt/jwt包

    github: https://github.com/golang-jwt/jwt golang-jwt/jwt 是一个在 Go 语言中使用 JSON Web Tokens(JWT)进行身份验证和授权的库。JWT 是一种用于在跨网络进行安全通信的开放标准(RFC 7519),它使用一个 JSON 对象来表示被声明的安全性信息。 golang-jwt/jwt 包提供了创建、解析和验证 JWT 的功能

    2024年01月23日
    浏览(29)
  • 7天玩转 Golang 标准库之 http/net

    在构建web应用时,我们经常需要处理HTTP请求、做网页抓取或者搭建web服务器等任务,而Go语言在这方面为我们提供了强大的内置工具:net/http标准库,它为我们操作和处理HTTP协议提供了便利。 首先,我们来看看如何使用net/http标准库发送一个HTTP请求。net/http库中的 http.Get 函数

    2024年02月04日
    浏览(40)
  • golang官方限流器rate包实践

    日常开发中,对于某些接口有请求频率的限制。比如登录的接口、发送短信的接口、秒杀商品的接口等等。 官方的 golang.org/x/time/rate 包中实现了令牌桶的算法。 封装限流器可以将ip、手机号这种的作为限流器组的标识。 接下来就是实例化限流器和获取令牌函数的实现 packag

    2024年02月13日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包