https://bbubbush.tistory.com/36
@Slf4j
@RestController
public class test {
public String encodeBcrypt(String plainText, int strength){
String changed = new BCryptPasswordEncoder(strength).encode(plainText);
System.out.println("changed = " + changed);
return changed;
}
public boolean matchesBcrypt(String planeText, String hashValue, int strength){
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(strength);
return passwordEncoder.matches(planeText, hashValue);
}
@GetMapping("/test")
public String pass(){
String tony = "asdf";
String changed = encodeBcrypt(tony,10);
System.out.println(changed);
return changed;
}
}
changed = $2a$10$gbm4jwsOt6Yv24SvqoAKFuNc1kA.BSmL.Oi1OaZFZjDPm4jdEWLmG
$2a$10$gbm4jwsOt6Yv24SvqoAKFuNc1kA.BSmL.Oi1OaZFZjDPm4jdEWLmG
다음은 암호화하는 서비스 메서드를 만든다. BCryptPasswordEncoder를 빈으로 등록하지 않은 이유는 반복횟수를 설정하는 방법이 생성자를 사용하는 방법뿐이기 때문이다. 그래서 아래 방법은 사용자의 요청에 따라 반복횟수를 4~12까지 설정할 수 있는 기능을 제공한다. (설정하지 않으면 기본적으로 10으로 세팅한다)
BCryptService.java
public String encodeBcrypt(String planeText, int strength) {
return new BCryptPasswordEncoder(strength).encode(planeText);
}
반복횟수를 10번으로 "Hello, world"를 암호화하니 아래와 같은 값이 나왔다. 자세히 보면 몇 번 반복했는지 반복 횟수가 해시값 안에 적혀있다.
$2a$10$PDWPOmb3KGyKG1GpL78LH.0FGb3iayOEB3iqjRxuEM/qL0yzSQUdS
BCrypt 값 비교하기
마지막으로 BCrypt 해시값과 입력받은 평문이 서로 일치하는지 어떻게 확인하는지 살펴보겠다. 앞서 이야기한 것과 같이 BCrypt는 매번 해시값이 달라진다. 그래서 BCryptPasswordEncoder의 도움을 받아야 한다.
public boolean matchesBcrypt(String planeText, String hashValue, int strength) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(strength);
return passwordEncoder.matches(planeText, hashValue);
}
matches()를 사용할 때는 첫 번째 파라미터로 평문의 텍스트, 두 번째 파라미터로 인코딩 값을 사용해야 한다. 실수하기 좋은 부분이니 기억해두면 좋다.
'Spring' 카테고리의 다른 글
StringUtils.isEmpty is deprecated (0) | 2024.02.26 |
---|---|
SpringFramework StringUtils 제공 메서드 (0) | 2024.01.04 |
Spring MVC 구조 (0) | 2023.03.15 |
@Controller와 @RestController,(cannot resolve mvc view 'index') (0) | 2023.03.15 |
Spring 윈도우 에서 build 하는 법 (0) | 2023.03.14 |