在go语言中使用crypto/bcrypt实现用户密码非明文存储示例
Go  /  管理员 发布于 5个月前   324
为什么不能明文存储密码?
明文就是直接存储密码,这样有很大的风险,比如数据泄露,被人攻击等问题。
所以为了避免这些问题,我们需要对密码进行加密存储。
非明文存储密码
哈希算法
密码哈希是一种将密码转换为固定长度字符串的技术,这个字符串与原始密码完全不同且不可逆。
盐值
盐值 (salt) 是指在进行密码哈希之前,向密码添加的一段随机数据。
通常被添加到密码的开头或结尾,或者插入到密码的某个位置。
其主要目的是确保即使两个用户拥有相同的密码,最终存储在数据库中的哈希值也会不同。
代码实现
在 Go 中,我们可以使用 golang.org/x/crypto/bcrypt 库
来处理密码的哈希和验证并且它内置了盐值的生成和管理。
示例代码:
package main
import (
"fmt"
"log"
"golang.org/x/crypto/bcrypt"
)
// HashPassword函数将密码进行哈希处理
func HashPassword(password string) (string, error){
// 使用bcrypt生成密码的哈希值
hashedPassword,err:=bcrypt.GenerateFromPassword([]byte(password),
bcrypt.DefaultCost)
if err != nil {
return "", err
}
return string(hashedPassword), nil
}
// CheckPasswordHash函数验证输入的密码是否正确
func CheckPasswordHash(password, hashedPassword string) bool {
// 使用bcrypt比较密码和哈希值
err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
return err == nil
}
func main() {
// 假设这是用户输入的密码
password := "cxcxcxpassword"
// 哈希密码
hashedPassword, err := HashPassword(password)
if err != nil {
log.Fatalf("错误: %v", err)
}
fmt.Printf("原始密码: %s\n", password)
fmt.Printf("哈希后的密码: %s\n", hashedPassword)
// 验证密码
isValid := CheckPasswordHash(password, hashedPassword)
fmt.Printf("密码验证结果: %v\n", isValid)
}
过程:
引入包:
我们使用 golang.org/x/crypto/bcrypt 包来处理密码的哈希和验证。
HashPassword 函数:
该函数使用 bcrypt 库生成密码的哈希值。
bcrypt 在内部自动生成一个盐值,并将其添加到密码中进行哈希处理。
生成的哈希值包含了盐值,因此在验证密码时不需要单独存储盐值。
CheckPasswordHash 函数:
该函数使用 bcrypt 库比较输入的密码和存储的哈希值。
bcrypt 库会从哈希值中提取盐值,并使用它来验证密码。
总结
这就是用户密码的非明文存储,密码哈希算法可以有效地保护用户密码的安全,
有效防止密码泄露,保护用户数据安全。
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号