bcrypt,是一个跨平台的文件加密工具。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。
bcrypt 和其他对称或非对称加密方式不同的是,不是直接解密得到明文,也不是二次加密比较密文,而是把明文和存储的密文一块运算得到另一个密文,如果这两个密文相同则验证成功。
jbcrypt 是 bcrypt 加密工具的 java 实现。
用 jbcrypt 对同一个明文加密后因为 salt 一般不同,加密后的密文一般不同,且bcrypt 是不可逆的加密算法(使用的是Blowfish加密算法),无法通过解密密文得到明文。采用hash+salt的方式,使用密码生成salt和hash,并将salt加入到hash里面去,从而使得salt不需要单独保存,同时嫌“MD5”计算速度“太快”,从而加入了反复执行的功能,降低暴力破解的风险。
<!-- https://mvnrepository.com/artifact/org.mindrot/jbcrypt -->
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.4</version>
</dependency>
BCrypt.gensalt() : 生成salt的方法,一般不需要单独调用,和下面的方法一起使用。gensalt() 生成盐的方法默认入参是10,你也可以设置复杂的入参,有效的数值在(4-30)
BCrypt.hashpw(password, BCrypt.gensalt(4)):生成hash密码,传入用户密码和salt。虽然是在生成salt的时候传入了一个整数,单该数字只是加在了盐的前缀上,用于在计算hash的时候使用。
BCrypt.checkpw(candidate, hashed):密码验证,传入密码候选值和hash密码,返回布尔值。
package com.test.jenkins;
import org.mindrot.jbcrypt.BCrypt;
public class Jenkins {
public static void main(String[] args)
{
//加密
String hashed = BCrypt.hashpw("123456", BCrypt.gensalt());
System.out.println(hashed);
//解密
if (BCrypt.checkpw("111111", hashed))
System.out.println("密码正确");
else
System.out.println("密码错误");
}
}
在之前的一些web系统中,会使用MD5+SALT的方法,每个用户的salt不同,还要单独保存。使用JBCrypt的话,salt就可以隐藏起来了,系统不需要保存salt,因为salt就保存在hash密码中了。又一个开箱即用的好工具。
在JBCrypt中,使用了JDK8的SecureRandom类(随机数类)。