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

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

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

文档

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

安装

复制代码
go get -u golang.org/x/crypto/bcrypt

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

Go 复制代码
package main

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

func main() {
	password := "123qwe"
	hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	fmt.Println(string(hashedPassword))
}

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

Go 复制代码
package main

import (
	"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
}

案例三:

Go 复制代码
package main

import (
	"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)以平衡安全性和性能。
  • 在实际应用中,错误处理是非常重要的,示例代码中为了简单起见忽略了错误处理。
  • 密码加密后存储在数据库中,用户登录时需要进行校验。
相关推荐
GoGeekBaird2 分钟前
别再给每个 AI 做自我介绍了:我做了一个「个人上下文」管理系统
后端·github·agent
2601_9669496514 分钟前
如何封装 qd.klines.batch(),让批量 K 线查询函数在多个策略中复用?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
码事漫谈17 分钟前
腾讯混元 Hy4 正式版发布了
后端
Mikko717 分钟前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
神仙别闹1 小时前
基于Python实现英词语自动对齐系统
开发语言·python
akinggw1 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
苍何2 小时前
DeepSeek的Super-agent 设计,和我们的工程实践
后端
Patrick_Wilson2 小时前
第一次读 Go 项目:从两个源码文件弄清 package、import 和 go.mod
后端·go·编程语言
Patrick_Wilson2 小时前
执行 go build . 后,Go 怎样找到代码并生成程序
后端·go·编程语言
用户6919026813392 小时前
Redis 2:Redis 在怎么处理harness记忆
后端