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的过程,将传入的密码按照加密串携带的盐值进行加密,加密后与传入的加密串作比较
  • 由此可以解释同一个密码加密后生成不同的加密串依然可以匹配成功。

    在这里插入图片描述

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/2d61b679da.html