Spring Security - 使用 Bcrypt 代替 MD5/SHA1

前言:

如果数据库被“拖库”明文存储的密码就变得不安全。之前的做法是使用 md5 散列的方式,因为 md5 不可逆,无法从密文推出原文。

MD5/SHA1为什么不安全:

HASH 算法最大的问题是,会发生撞库,也就是说,有可能出现多个原文得到同一个密码。

下面这个式子是存在的,如果原文是 M1,只需要另外一个同样 HASH 值的密码即可登录。

MD5(M1) = MD5(M2) = MD5(M3)

1. 一种攻击方法是,攻击者记录了一张巨大的密码库,预先计算了常用密码的 hash 值,这样只需要搜索 hash 值就能寻找到一个合适的密码用于登录。

这就是被彩虹表攻击。

解决彩虹表的问题是加盐,在加密之前,对原文混入其他信息,混入的信息不存放到数据库中。实际寻找到其他原文也无法登录。

生成一个随机数,我们称之为salt,然后在数据库中记录salt和h=hash(pwd + salt),查询的时候,得到用户的口令p,然后从数据库中查出salt,计算hash(p+salt),看是不是等于h,等于就是对的,不等于就是不对的。

2. 第二中攻击方法是王小云教授寻找到的一种新的方法,通过算法快速的找到 M2,这样不依赖彩虹表就可以实施攻击。

MD5(M1) = MD5(M2)

当被攻击者价值非常大,攻击者获取足够多的撞库原文,还是能分析盐值。

Bcrypt

Bcrypt 有两个特点

  • 每一次 HASH 出来的值不一样
  • 计算非常缓慢

因此使用 Bcrypt 进行加密后,攻击者想要使用算出 M2 成本变得不可接受。但代价是应用自身也会性能受到影响,不过登录行为并不是随时在发生,因此能够忍受。对于攻击者来说,需要不断计算,让攻击变得不太可能。

BCryptPasswordEncoder的加密是带salt的加密,所以说我们用它就可以方便很多,而且经过踩坑发现,它的salt也是嵌在加密后的密文中的,所以我们也不用保存salt,业务逻辑就是,用户注册时我们用它进行encode,然后校验时用它的matches方法就行了。

总体来说,这种加密方式的有点

1. 登录密码进行加密后再存储到DB,即使被拖库,不会泄露密码,因为很多用户,在各个网站上为了密码易记忆,都是采用了同一个密码,那一个平台泄露,处处平台泄露极其不安全

2. 那简单的加密,比如对一个字符串N次加密,每次得到的密码是一致的,这种也不安全,用户多了你会发现,很多人的密码是一样的,比如我常见的密码12345,12qwaszx等等

3. 同样的密码, 需要加密后存储的值不一样,又能保证下次登录能够正确,BCrypt比其他加密方式多了一些thoughts

因此推荐使用 Bcrypt 进行密码加密。

升级加密手段:

为了对抗彩虹表,我们要做的工作是避免预先计算,让攻击者无法(或者非常困难)提前计算好彩虹表。

为了反映为何彩虹表计算是可行的,我们再来算一下。我们假设用户可能输入的口令是键盘上的小写字母和数字,共26+10=36种,之所以这样假设是因为 一个用户比较多的系统中总是会有一些弱口令用户的,我们假设输入的口令至少5个字符,至多12个字符,那么用户可能的输入一共有:


,而12个字节可能的组合应有


种。如果再考虑到用户为了方便记忆,输入的口令是一些已经存在的单词或是词组,可能的输入将会远远少于

。用户可能的输入少了,就给了我们枚举的空间。

为了阻止这种枚举,加salt的方法是扩大用户输入的一种简单有效的途径,随机生成一个16字节的随机数,加上用户本身输入的至多12个字符的口令,可能的输入就有

种,这么多种可能性,任何一个机构和组织都没有办法存储规模如此庞大的彩虹表。

另外一种方法是通过提升Hash的复杂度,延长攻击者进行暴力破解时所消耗的时间。现在显卡用于并行计算实在太容易,6位纯数字的口令在显卡看来就是秒破。Hash算法的多次迭代就是最简单的延长计算时间的方法,Apache的htpasswd就使用了MD5的1000次迭代,不过只是使得这些口令稍微难破解一些。

另外,题中使用了SHA1和MD5两种算法的方法,除了稍微提升一点计算的难度以外,并没有多好,这种组合方法不能增加用户输入的可能性,另外虽然SHA1生成的是160位的Hash,但是由于输入是一个128位的MD5,所以输出也至多只可能有

种可能,猜测的范围也没有缩小。所以这是原来回答我建议你使用更多次数(如1000次)MD5迭代的原因,至少应当有一个方面有稍微大一些的加强。

参考:

https://www.cnblogs.com/lixiong/archive/2011/12/24/2300098.html

https://www.baidu.com/link?url=8418ZuBW-AmQ1NMClQhN0lru7JQYKpMHCM-PJPZ5d7I1zgnkipPCCm6qEpK9OWe9&wd=&eqid=b6fda318005c87c0000000065e056b3d

https://blog.csdn.net/qq_25353433/article/details/90643452

猜你喜欢

转载自blog.csdn.net/qq_26878363/article/details/103727843