Bcrypt采用随机盐的方式,进行密码混淆。
基本使用
导入相关依赖:
导入相关依赖。
1 | <dependencies> |
测试demo一:
1 | private static void bcryptEncrypt() { |
生成结果:
1 | [*]-------第1次 |
hash格式说明:
$2a:申明Bcrypt算法
$10:轮循10次,默认为10,在区间4与31之间。
$1-22位,表示盐,最后31位表示密文。
原理部分:
疑惑一
同一密码,每次生成的hash都不一样,那么它是如何进行校验的?
打开源码,可以看到,从hash中取的saltsalt跟password进行hash;得到的结果传入的的hash进行比对,完成校验。
疑惑二
通过增加轮循次数来增加破暴破时间,和md5或sha-1多次效果是否等效?
因为bcrypt源自Blowfish块密码.进行多次迭代的目的是使密码处理变慢,尤其是对攻击者而言变慢,因为它会阻止大量的密码猜测.但是攻击者可能会使用普通系统不使用的硬件,例如programmable GPU,大大提高了适用于这种硬件的计算能力. Blowfish和bcrypt使用基于RAM的查找表(在处理过程中修改的表);这样的表对于通用CPU来说很容易处理,但是在GPU上却很麻烦.因此,bcrypt在某种程度上阻碍了攻击者使用GPU的处理能力。
疑惑三
增加轮循次数防暴力破解效果有多大?
直接看测试效果比较明显。轮循次数为10和20的时间花费情况:
测试demo二:
1 | public class bcryptStudy { |
生成结果:
1 | $2a$10$SOi7S1vfmSaBVtIWZ/g7ku3aKuYYRDrnnJijaEPvIh3CojRb9/lVm |
发现轮循次数为10和20的时间花费相差大约1000倍,生成一个轮循次数为10的大约需要花费200ms,很慢(和md5比起来),生成一个轮循次数为20的大约需要花费200s,这。。。
注:轮循20次是真的慢。。。加密的速度也太慢了,在生成hash的过程中都想中断进程了,别说攻击者暴力跑了。。。
优势与劣势:
优:
- 动态盐,每次随机22位字符;
- 不用本地保存与盐相关的字段。
- Bcrypt的加密时间非常慢,暴力破解需要枚举遍历所有可能结果时,增加了破解的难度。
劣势:
- 效率低。
总结:
1.bcrypt做为一个跨平台的文件加密工具。在现有的spring中运用,足以看出他的地位。安全与性能需要找个平稀点,越慢的算法越安全。通过salt和const这两个值来减缓加密过程,ta的加密时间(百ms级)远远超过md5(大概1ms左右)。对于计算机来说,Bcrypt 的计算速度很慢,但是对于用户来说,这个过程不算慢。
2.服务端在用户校验时增加token或验证码,做好防止批量提交的准备,也可预防恶意用户进行压力负担,影响服务端性能。
3.轮循次数默认的10就挺好,没必要再加了。。。
4.推荐使用!!!