Go语言(Golang)密码加密存储(数据库中密码存储)
2020-06-30 11:19
2051 查看
很多系统都是将密码进行一次 MD5 或 SHA1 Hash后存入数据库中。这样的密码抵挡不住字典攻击。所谓字典攻击,就是将常用密码进行Hash后做成一个字典,破解的时候,只需要查字典就能知道对应的明文密码。
为了抵御字典攻击,推荐的做法是使用 密码 + 盐(一串随机数) 再Hash的方式。每个密码对应一个不同的随机数。这个方法,实际上是将密码人为地拓展了N位,导致密码长度大增,使得攻击者无法构造这么大的一个字典。
Go语言提供了一种较为安全的加密方式,使用GoLang golang.org/x/crypto/bcrypt 模块,通过该模块可以快速实现密码的存储处理。
package main import ( "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种方法可以结合使用
相关文章推荐
- Web安全--使用Salt + Hash将密码加密后再存储进数据库
- 使用 Salt + Hash 将密码加密后再存储进数据库
- 使用 Salt + Hash 将密码加密后再存储进数据库
- 某公司数据库密码规定为5位组成的字符串,存储之前,需要将其加密
- 使用 Salt + Hash 将密码加密后再存储进数据库
- 用 MD5 加密数据库中的用户密码
- SrpingDruid数据源加密数据库密码的示例代码
- druid 数据库密码加密
- spring的PreferencesPlaceholderConfigurer类对数据库密码进行加密
- PropertyPlaceholderConfigurer扩展,实现数据库密码加密
- springbootMaven项目Druid数据库密码加密
- 加密在 Web.Config 中存储的数据库连接字串
- spring web项目 数据库用户名密码加密解密
- MS 数据库存储过程加密解密
- 登山-C#-对密码进行加密存储
- SQLSERVER使用密码加密备份文件以防止未经授权还原数据库
- bcrypt npm作用:加密密码 存到数据库
- 关于加密:本地用户名与密码安全的存储方案
- Python中密码加密存储
- 数据库中存储用户名、密码时如何处理?