golang中bcrypt包实现密码
说明:
很多系统都是将密码进行一次 MD5 或 SHA1 Hash后存入数据库中。这样的密码抵挡不住字典攻击。所谓字典攻击,
就是将常用密码进行Hash后做成一个字典,破解的时候,只需要查字典就能知道对应的明文密码。
为了抵御字典攻击,推荐的做法是使用 密码 + 盐(一串随机数) 再Hash的方式。每个密码对应一个不同的随机数。
这个方法,实际上是将密码人为地拓展了N位,导致密码长度大增,使得攻击者无法构造这么大的一个字典。
- bcrypt是单向hash加密算法,不可反解生成明文,bcrypt是一种加盐的加密方法,
安装:
go get golang.org/x/crypto/bcrypt
使用
package main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
"log"
)
func main() {
// 方法1:
// GenerateFromPassword 以给定的代价返回密码的 bcrypt 哈希值。如果给定的成本小于 MinCost
// 则成本将设置为 DefaultCost。使用此包中定义的 CompareHashAndPassword 将返回的散列密码与其明文版本进行比较。
pwd := []byte("123456")
hash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.DefaultCost)
if err != nil {
log.Fatalln(err.Error())
}
fmt.Println(string(hash))
// CompareHashAndPassword 将 bcrypt 散列密码与其可能的明文等效密码进行比较。成功时返回 nil,失败时返回错误。
if err := bcrypt.CompareHashAndPassword([]byte("$2a$10$OVW0MmWrPVIl8f0ACVDQme3fe8EBiMPe1U0cpfdtnDsvBlByz8/yS"), pwd); err != nil {
fmt.Println(err.Error())
return
} else {
fmt.Println("密码正确")
}
}
总结:
password: 123456
$2a$10$BcF6iw8csEry7UallKJlO.vQdZA.G9bXGtCPJ/eVJacMGCNPxsEVC
$2a$10$OVW0MmWrPVIl8f0ACVDQme3fe8EBiMPe1U0cpfdtnDsvBlByz8/yS
$2a$10$tMdrC/33wJ8B7tR3ThaBeuYiPba5XDqIMyO45DauAVkPOslULLQHO
说明,每次运行计算的密码值都不相同,因此使用bcrypt模块对密码进行处理,可以避免字典攻击
分类:
golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)