AI智能
改变未来

Go语言(Golang)密码加密存储(数据库中密码存储)

精选30+云产品,助力企业轻松上云!>>>

很多系统都是将密码进行一次 MD5 或 SHA1 Hash后存入数据库中。这样的密码抵挡不住字典攻击。所谓字典攻击,就是将常用密码进行Hash后做成一个字典,破解的时候,只需要查字典就能知道对应的明文密码。

为了抵御字典攻击,推荐的做法是使用 密码 + 盐(一串随机数) 再Hash的方式。每个密码对应一个不同的随机数。这个方法,实际上是将密码人为地拓展了N位,导致密码长度大增,使得攻击者无法构造这么大的一个字典。

Go语言提供了一种较为安全的加密方式,使用GoLang golang.org/x/crypto/bcrypt 模块,通过该模块可以快速实现密码的存储处理。

package mainimport (\"fmt\"\"golang.org/x/crypto/bcrypt\")type User struct {Name     string `json:\"name\"`Password string `json:\"password\"`}func main() {fmt.Println(\"====模拟注册====\")u0 := User{}u0.Password = \"pwd\" //模拟注册是传递的密码hash, err := bcrypt.GenerateFromPassword([]byte(u0.Password), bcrypt.DefaultCost) //加密处理if err != nil {fmt.Println(err)}encodePWD := string(hash) // 保存在数据库的密码,虽然每次生成都不同,只需保存一份即可fmt.Println(encodePWD)fmt.Println(\"====模拟登录====\")u1:=User{}u1.Password=encodePWD //模拟从数据库中读取到的 经过bcrypt.GenerateFromPassword处理的密码值loginPwd:=\"pwd\" //用户登录时输入的密码// 密码验证err = bcrypt.CompareHashAndPassword([]byte(u1.Password), []byte(loginPwd)) //验证(对比)if err != nil {fmt.Println(\"pwd wrong\")} else {fmt.Println(\"pwd ok\")}}

运行效果:

第一次运行:

第二次运行:

说明:每次运行,计算的密码值都不同。因此使用GoLang golang.org/x/crypto/bcrypt 模块对密码进行处理,可以避免字典攻击。

附:密码强弱的判断

方法1:正则表达式判断(长度、大小写、特殊字符)

方法2:建立一个若密码表,依据表中的密码判断是否为若密码

注:以上2种方法可以结合使用

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Go语言(Golang)密码加密存储(数据库中密码存储)