Golang使用bcrypt实现密码加密和校验的操作代码

 更新时间:2024年05月20日 14:53:32   作者:彭世瑜  
bcrypt可以用于数据库中的用户密码保存,相比md5而言更加的安全可靠,这篇文章主要介绍了Golang使用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 main
import (
    "fmt"
    "golang.org/x/crypto/bcrypt"
)
func main() {
    password := "123456"
    hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    fmt.Println(string(hashedPassword))
    // $2a$10$EvdBpymvP7uDfI0TFRD6RO3YXLwQWUVYKMDqbWFloYCtyNXHCmbD2
    // $2a$10$6JDH6z7dJljoDo4VolpHbeIgzqHwhUvF1JRJ/h7Ibf/PjGtx.wZGG
}

可以看到,多次运行后,生成的结果是不一样的

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

package main
import (
    "fmt"
    "golang.org/x/crypto/bcrypt"
)
func main() {
    password := "123456"
    hashedPassword := "$2a$10$EvdBpymvP7uDfI0TFRD6RO3YXLwQWUVYKMDqbWFloYCtyNXHCmbD2"
    err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
    fmt.Println(err)
    // <nil>
}

由于算法的入参和出参都是字节类型的数据,为了便于使用,可以将两个方法简单封装成一个工具类,将入参和出参都改为是字符串类型的数据

package utils
import (
    "golang.org/x/crypto/bcrypt"
)
func GenerateFromPassword(password string) (string, error) {
    hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    if err != nil {
        return "", err
    }
    return string(hashedPassword), err
}
func CompareHashAndPassword(hashPassword string, password string) bool {
    err := bcrypt.CompareHashAndPassword([]byte(hashPassword), []byte(password))
    return err == nil
}

到此这篇关于Golang使用bcrypt实现密码加密和校验的文章就介绍到这了,更多相关Golang密码加密和校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 创建Go工程化项目布局详解

    创建Go工程化项目布局详解

    这篇文章主要介绍了创建Go工程化项目布局详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 浅谈go中切片比数组好用在哪

    浅谈go中切片比数组好用在哪

    数组和切片都是常见的数据结构,本文将介绍Go语言中数组和切片的基本概念,同时详细探讨切片的优势,感兴趣的可以了解下
    2023-06-06
  • go语言beego框架分页器操作及接口频率限制示例

    go语言beego框架分页器操作及接口频率限制示例

    这篇文章主要为大家介绍了go语言beego框架分页器操作使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Go语言中使用gorm小结

    Go语言中使用gorm小结

    这篇文章主要给大家介绍了Go语言中如何使用gorm,文中介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • Golang 动态脚本调研详解

    Golang 动态脚本调研详解

    这篇文章主要为大家介绍了Golang 动态脚本调研详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • golang 实现struct、json、map互相转化

    golang 实现struct、json、map互相转化

    这篇文章主要介绍了golang 实现struct、json、map互相转化,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • GoLang实现Viper库的封装流程详解

    GoLang实现Viper库的封装流程详解

    Viper是一个用于Go语言应用程序的配置管理库,它提供了一种简单而灵活的方式来处理应用程序的配置,支持多种格式的配置文件,这篇文章主要介绍了GoLang封装Viper库的流程,感兴趣的同学可以参考下文
    2023-05-05
  • Go语言实现聊天小工具的示例代码

    Go语言实现聊天小工具的示例代码

    这篇文章主要为大家详细介绍了如何利用Go语言实现聊天小工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Go语言实现二分查找方法示例

    Go语言实现二分查找方法示例

    这篇文章主要为大家介绍了Go语言实现二分查找方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 浅析go语言如何实现协程的抢占式调度的

    浅析go语言如何实现协程的抢占式调度的

    go语言通过GMP模型实现协程并发,为了避免单协程持续持有线程导致线程队列中的其他协程饥饿问题,设计者提出了一个抢占式调度机制,本文会基于一个简单的代码示例对抢占式调度过程进行深入讲解剖析
    2024-04-04

最新评论