Bcrypt加密算法相关
简介
Bcrypt是一个跨平台的文件加密工具,由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。spring-security内部就是使用这个算法来对用户密码加密的(BCryptPasswordEncoder)。
使用
maven依赖
<dependency>
<groupId>de.svenkubiak</groupId>
<artifactId>jBCrypt</artifactId>
<version>0.4.1</version>
</dependency>
代码
import org.mindrot.jbcrypt.BCrypt;
public class TestBcrypt {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
String salt = BCrypt.gensalt();
System.out.println("salt: " + salt);
String hashpw = BCrypt.hashpw("123456", salt);
System.out.println("hashpw: " + hashpw);
System.out.println(BCrypt.checkpw("123456", hashpw));
}
}
}
输出结果
salt: $2a$10$/kpjuzm.r8T5hpYQZxFHju
hashpw: $2a$10$/kpjuzm.r8T5hpYQZxFHju98AbpBhNSGoYVnLWtKtqRjeozMwsQ22
true
salt: $2a$10$xqWUM8AZJ2pRBCQ79hT7ce
hashpw: $2a$10$xqWUM8AZJ2pRBCQ79hT7ceMUugGCDnQvG6Py2UIq9/rjr4SgQVgLW
true
salt: $2a$10$ztyWg.wF8zmn1DZCBaUuRO
hashpw: $2a$10$ztyWg.wF8zmn1DZCBaUuRO7aDeGt1o9DJ9AfmN9L/lxHOWaQeG3gS
true
hash格式说明:
$2a:申明Bcrypt算法
$10:轮循10次,默认为10,在区间4与31之间。
$1-22位,表示盐,最后31位表示密文。
最后生成的密文中是包含salt值的,
密码校验的原理
原密码为pw,加密之后的密码为hashpw,盐值为salt,待校验密码为plaintext,从hashpw中获取真正的salt值,使用salt和plainpw加密,将结果和hashpw比较。
总结
优点:
- 动态盐,每次随机22位字符;
- 不用本地保存与盐相关的字段。
- Bcrypt的加密时间非常慢,暴力破解需要枚举遍历所有可能结果时,增加了破解的难度。
缺点:
- 效率低。加密时间(百ms级)远远超过md5(大概10ms左右),对于计算机来说,Bcrypt 的计算速度很慢,但是对于用户来说,这个过程不算慢。