密码加密 | 青训营笔记

174 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记

在我们的项目中,我们需要对数据库中的用户密码进行加密。经过思考后,我们选择了 bcrypt 加密算法。

为什么要对密码进行加密

当用户登录时,输入用户名和密码,然后后端直接去数据库中查找就可以了。好像不加密也是可以的。但是考虑到安全性。假设极端情况下,数据库数据泄露了,那用户的账号密码就泄露了。如果进行加密,则可以起到一定的保护作用。

而我们选择了 bcrypt 加密算法,好处就不止这一点点了。除了上述作用外,还有防止 hash 碰撞的作用。

Bcrypt 加密算法

Bcrypt 有四个变量:

  1. saltRounds: 正数,代表hash杂凑次数,数值越高越安全,默认10次。
  2. myPassword: 明文密码字符串。
  3. salt: 盐,一个128bits随机字符串,22字符
  4. myHash: 经过明文密码password和盐salt进行hash。循环加盐,得到myHash

myPassword 进行 saltRounds 次与 salt 加密得到 myHash。然后将 BCrypt版本号、saltRounds、salt、myHash合起来获得最终结果。

因为是进行多次 Hash 后获得结果,所以是一个单向加密算法。只能加密,无法获得明文。这也防止了数据库数据泄露后,他人通过密文直接解密出密码。

如何防止 Hash 碰撞

Bcrypt 加密速度较慢,这样,如果每次进行匹配时所需要的时间就会更多。从而让攻击者无法短时间破解出明文。网上有文章指出:Bcrypt 一个密码出来的时间比较长,需要 0.3 秒,而 MD5 只需要一微秒(百万分之一秒),一个 40 秒可以穷举得到明文的 MD5 ,如果使用 Bcrypt 则需要 12 年,时间成本太高。原文连接:如何防范密码被破解

Golang 使用 Bcrypt

首先导入:import "golang.org/x/crypto/bcrypt"

进行加密:hash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.MinCost)

密码验证:err := bcrypt.CompareHashAndPassword(byteHash, plainPwd)

好啦好啦!!!!