这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
在我们的项目中,我们需要对数据库中的用户密码进行加密。经过思考后,我们选择了 bcrypt 加密算法。
为什么要对密码进行加密
当用户登录时,输入用户名和密码,然后后端直接去数据库中查找就可以了。好像不加密也是可以的。但是考虑到安全性。假设极端情况下,数据库数据泄露了,那用户的账号密码就泄露了。如果进行加密,则可以起到一定的保护作用。
而我们选择了 bcrypt 加密算法,好处就不止这一点点了。除了上述作用外,还有防止 hash 碰撞的作用。
Bcrypt 加密算法
Bcrypt 有四个变量:
- saltRounds: 正数,代表hash杂凑次数,数值越高越安全,默认10次。
- myPassword: 明文密码字符串。
- salt: 盐,一个128bits随机字符串,22字符
- 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)
好啦好啦!!!!