Spring Security BCryptPasswordEncoder的使用及原理

1.密码加密

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class TestPasswordEncode{

    @Test
    void testPassword() {
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        // 原始密码
        String sourcePassword = "000000";
        // 加密后的密码
        String resPassword1 = encoder.encode(sourcePassword);
        // 加密后的密码
        String resPassword2 = encoder.encode(sourcePassword);
        System.out.println("原密码:" + sourcePassword);
        System.out.println("加密密码1:" + resPassword1);
        System.out.println("加密密码2:" + resPassword2);
    }
}

在这里插入图片描述
备注:同一个密码,两次调用encode生成的加密密码是不一样的

2.密码匹配

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class TestPasswordEncode{

    @Test
    void testPassword() {
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        // 原始密码
        String sourcePassword = "000000";
        // 加密后的密码
        String resPassword1 = encoder.encode(sourcePassword);
        // 加密后的密码
        String resPassword2 = encoder.encode(sourcePassword);
    	// 匹配结果1
        boolean match1 = encoder.matches(sourcePassword, resPassword1);
        // 匹配结果2
        boolean match2 = encoder.matches(sourcePassword, resPassword2);
        System.out.println("原密码:" + sourcePassword);
        System.out.println("加密密码1:" + resPassword1);
        System.out.println("加密密码2:" + resPassword2);
        System.out.println("匹配结果1:" + match1);
        System.out.println("匹配结果2:" + match2);
    }
}

在这里插入图片描述
备注:两次加密后生成的加密串虽然不同,调用matches方法都返回true

3.原理

  • BCryptPasswordEncoder加密时会默认加盐,且每次的盐值是随机的。
  • 由此可以解释同一个密码,调用两次encode方法生成的加密串是不一样的。
  • 生成salt盐值的方法
    在这里插入图片描述
    在这里插入图片描述
  • 加密串中包含生成当前加密串的盐值和hash值
  • matches匹配方法每次需要传入原始密码和该原始密码的encode加密串
  • matches方法验证的过程等同于encode的过程,将传入的密码按照加密串携带的盐值进行加密,加密后与传入的加密串作比较
  • 由此可以解释同一个密码加密后生成不同的加密串依然可以匹配成功。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值