MD5
MD5是一种被广泛使用的密码散列函数,不可逆(法从密文推出原文),但是HASH 算法最大的问题是,会发生撞库,也就是说,有可能出现多个原文得到同一个密码。
一种攻击方法是,攻击者记录了一张巨大的密码库,预先计算了常用密码的 hash 值,这样只需要搜索 hash 值就能寻找到一个合适的密码用于登录。这就是被彩虹表攻击。
解决彩虹表的问题是加盐,在加密之前,对原文混入其他信息,混入的信息不存放到数据库中。实际寻找到其他原文也无法登录。
Bcrypt
Bcrypt 有两个特点
1.每一次 HASH 出来的值不一样
2.计算非常缓慢
因此使用 Bcrypt 进行加密后,攻击者想要使用算出 M2 成本变得不可接受。但代价是应用自身也会性能受到影响,不过登录行为并不是随时在发生,因此能够忍受。对于攻击者来说,需要不断计算,让攻击变得不太可能。
因此推荐使用 Bcrypt 进行密码加密