복붙노트

[SPRING] 스프링 보안 - BcryptPasswordEncoder

SPRING

스프링 보안 - BcryptPasswordEncoder

우리 애플리케이션에서 Spring 보안을 사용하고 비밀번호 변경 옵션을 위해 DB에 저장된 비밀번호로 사용자 입력의 유효성을 검사하고 싶습니다.

암호는 DB에 다음과 같이 저장됩니다.

user.setPassword(new BCryptPasswordEncoder().encode("<userPassword>"));

여기서 사용자가 입력 한 비밀번호는 위의 로직을 사용하여 인코딩되어 DB에 저장됩니다. 이제 비밀번호 변경을 위해 사용자로부터 비밀번호를 얻으려고합니다. 사용자로부터 암호를 얻은 후에 위의 논리를 사용하여 인코딩하고 DB와 비교해보십시오. 인코딩 된 값은 인코딩에 대해 동일한 로직을 사용한다고해도 다른 것처럼 보입니다.

WebSecurityConfig의 구성 :

@Autowired
public void configAuthentication(final AuthenticationManagerBuilder auth) throws Exception {

    auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());

}

나는 무엇이 잘못되었는지를 잘 모른다.

해결법

  1. ==============================

    1.Bcrypt 알고리즘은 매번 다른 내장 소금 값을 사용합니다. 그래서 동일한 Clear Text 같은 인코딩 과정조차도 다른 암호문을 생성합니다.

    Bcrypt 알고리즘은 매번 다른 내장 소금 값을 사용합니다. 그래서 동일한 Clear Text 같은 인코딩 과정조차도 다른 암호문을 생성합니다.

    원시 암호를 인코딩하지 마십시오. rawPassword가 클라이언트가 제공 한 암호이고 encodedPassword가 데이터베이스의 암호화 된 저장된 암호라고 가정합니다. 그런 다음 rawPassword를 인코딩하고 String # equals를 사용하여 결과를 비교하는 대신 PasswordEncoder # matches 메소드를 사용하십시오.

    PasswordEncoder passwordEnocder = new BCryptPasswordEncoder();
    if (passwordEncoder.matches(rawPassword, encodedPassword)) {
        System.out.println("Matched!");
    }
    
  2. from https://stackoverflow.com/questions/36324113/spring-security-bcryptpasswordencoder by cc-by-sa and MIT license