当前位置: 首页 > 工具软件 > jBCrypt > 使用案例 >

BCrypt - JBCrypt:方便、快捷的密码管理工具类

南门嘉
2023-12-01

介绍

        关于bcrypt

        bcrypt,是一个跨平台的文件加密工具。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。

        bcrypt 和其他对称或非对称加密方式不同的是,不是直接解密得到明文,也不是二次加密比较密文,而是把明文和存储的密文一块运算得到另一个密文,如果这两个密文相同则验证成功。

        关于jbcrypt

        jbcrypt 是 bcrypt 加密工具的 java 实现。

        用 jbcrypt 对同一个明文加密后因为 salt 一般不同,加密后的密文一般不同,且bcrypt 是不可逆的加密算法(使用的是Blowfish加密算法),无法通过解密密文得到明文。采用hash+salt的方式,使用密码生成salt和hash,并将salt加入到hash里面去,从而使得salt不需要单独保存,同时嫌“MD5”计算速度“太快”,从而加入了反复执行的功能,降低暴力破解的风险。

项目maven

<!-- 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类(随机数类)。

 类似资料: