Bcrypt 加密算法研究与对比
Bcrypt 加密算法研究与对比
一、什么是Bcrypt
1、bcrypt,是一个跨平台的文件加密工具。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的**。
2、Bcrypt是单向hash算法, 不可逆向解密,生成的密文是60位的。
二、Bcrypt如何加密与验证?
以SpringSecurity为例:BCryptPasswordEncoder类中有两个方法:encode
和matches
。前者用于加密,后者用于验证。
源码解析参考地址:https://www.cnblogs.com/chengxuxiaoyuan/p/11939084.html
(一)encode方法加密:
-
大致方法调用流程:
=>encode()
传入明文,准备加密
=>BCrypt.gensalt()
获取生成随机盐值salt
=>hashpw()
通过传入的salt生成real_salt。将real_salt和传入的明文,通过规则策略生成最终密文。 -
加密后的最终密文示例:(图片来源网上)
1、Bcrypt: 2a代表Bcrypt加密版本号。
2、Rouds: 迭代次方数,10是默认值。可以设置范围为4-31。最终迭代次数为2的Rouds次方。
3、Salt: 22位的盐值(即上述的real_salt)。
4、Hash:明文password和Salt一起hash加密后生成的密文,长度31位。
(二)matches方法验证:
- 大致方法调用流程:
=>matches()
传入明文与数据库密文准备进行验证。
=>BCRYPT_PATTERN.matcher()
校验数据库密文是否符合规范。
=>BCrypt.checkpw()
进入匹配明文与数据库密文。
=>hashpw()
传入明文与数据库密文。提取数据库密文中的指定位置的22位长度的盐值real_salt,将其与明文通过相同加密策略生成新密文。
=>equalsNoEarlyReturn()
新密文与数据库密文逐个字节比较,完全相同则说明验证成功。
三、如果使用彩虹表进行hash碰撞攻击会如何?
Bcrypt是种慢哈希算法,执行时间较长。同时随机盐可以有效抵御彩虹表,使用这该种算法时也需要指定相应的参数,使**难度增加。
四、比较
-
MD5加密算法的缺陷:
1、常规MD5加密,可使用彩虹表碰撞来进行攻击,可以匹配出原密码或者能得到相同密文的明文。
2、加盐使攻击者无法采用特定的查询表或彩虹表快速**大量哈希值,但不能阻止字典攻击或暴力攻击。这里假设攻击者已经获取到用户数据库,意味着攻击者知道每个用户的盐值,根据Kerckhoffs’s principle,应该假设攻击者知道用户系统使用密码加密算法,如果攻击者使用高端GPU或定制的ASIC,每秒可以进行数十亿次哈希计算,针对每个用户进行字典查询的效率依旧很高效。 -
相对于MD5,Bcrypt加密算法的特点:
1、相同明文通过Bcrypt生成的密文每次都是不一样的,MD5则相同。这样就无法通过直接比对密文来反推明文。
2、Bcrypt是种慢哈希算法,执行时间较长。有文章指出,针对某一字符串,Bcrypt执行一次加密约0.3秒,MD5加密约1微秒(百万分之一秒)。使得暴力**Bcrypt的时间成本很高。https://www.jianshu.com/p/2b131bfc2f10
3、Bcrypt加密长度60位,MD5是32位,提高穷举难度。 -
各种加密算法的比较参考:
https://www.cnblogs.com/tqlin/p/11320970.html
五、数据库迁移是否有问题?
Bcrypt算法是跨平台的加密算法,数据库迁移后,不会影响原数据的验证。
本文内容部分来自其他网站,如有侵权,请私信作者。
参考地址:
1、https://www.jianshu.com/p/2b131bfc2f10
2、https://www.cnblogs.com/chengxuxiaoyuan/p/11939084.html
3、https://www.cnblogs.com/qianjinyan/p/10636404.html
4、https://www.cnblogs.com/tqlin/p/11320970.html