Bcrypt加密算法相关

发布时间 2023-08-20 22:14:28作者: strongmore

简介

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 的计算速度很慢,但是对于用户来说,这个过程不算慢。

参考

Bcrypt加密技术