这是我参与「第五届青训营」笔记创作活动的第6天
我们使用bcrypt算法对密码进行随机加盐哈希处理。
- 为什么用bcrypt算法,而不用MD5算法的原因如下:
-
-
MD5 并不是一种加密算法,而是一种摘要算法,我们也可以叫它哈希函数,可以保证消息的完整性,但是不提供加密性。因此MD5算法每一个原始密码都会生成一个对应的固定密码,也就是说一个字符串生成的MD5 值是永远不变的。 这样的话,虽然它是不可逆的,但可以被穷举,而穷举的“产品”就叫做彩虹表。攻击者通过入侵拿到某些网站的数据库之后就可以通过预计算表中存储的映射来查找原始密码。
-
密码加盐后用MD5算法处理也不够安全。加盐后,攻击者破解一个用户密码的成本其实就等于发现哈希碰撞的概率,因为攻击者其实不需要知道用户的密码是什么,他只需要找到一个值 value,这个值加盐后的哈希与密码加盐后的哈希完全一致就能登录用户的账号。早在几十年前,就在 MD5 的设计中发现了缺陷并且在随后的发展中找到了低成本快速制造哈希碰撞的方法。2010 年 MD5 vulnerable to collision attacks —— CMU 软件工程机构认为 MD5 摘要算法已经在密码学上被破译并且不适合使用;
-
用加密看起来是没问题了,但是有一个致命的缺点,就是我们如何存储用于加密密码的秘钥。既然存储密码的仓库能被泄露,那么用于存储秘钥的服务也可能会被攻击,我们永远都没有办法保证我们的数据库和服务器是安全的,一旦秘钥被攻击者获取,他们就可以轻而易举地恢复用户的密码,因为核对用户密码的过程需要在内存对密码进行解密,这时明文的密码就可能暴露在内存中,依然有导致用户密码泄露的风险。
-
bcrypt算法如今也被广泛使用,就是为哈希密码而专门设计的,所以它是一个执行相对较慢的算法,这也就能够减少攻击者每秒能够处理的密码数量,从而避免攻击者的字典攻击。为了增加攻击者的成本,bcrypt 引入了计算成本这一可以调节的参数,能够调节执行 bcrypt 函数的成本。当我们将验证用户密码的成本提高几个数量级时,攻击者的成本其实也相应的提升了几个数量级,只要我们让攻击者的攻击成本大于硬件的限制,同时保证正常请求的耗时在合理范围内,我们就能够保证用户密码的相对安全。
-