[SPRING] BCryptPasswordEncoder는 동일한 입력에 대해 다른 암호를 생성합니다.
SPRINGBCryptPasswordEncoder는 동일한 입력에 대해 다른 암호를 생성합니다.
나는 봄 보안과 BCryptPasswordEncoder를 사용하고 있습니다. 하지만 문제는 동일한 입력에 대해 다른 인코딩 된 암호를 생성한다는 것입니다.
String password = "123456";
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(password);
System.out.print(encodedPassword);
output : $2a$10$cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi
output2 : $2a$10$KEvYX9yjj0f1X3Wl8S.KPuWzSWGyGM9ubI71NOm3ZNbJcwWN6agvW
output3 : $2a$10$nCmrPtUaOLn5EI73VZ4Ouu1TmkSWDUxxD4N6A.8hPBWg43Vl.RLDC
때마다 다른 출력을 생성합니다.
해결법
-
==============================
1.
public static void main(String[] args) { // spring 4.0.0 org.springframework.security.crypto.password.PasswordEncoder encoder = new org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder(); // $2a$10$lB6/PKg2/JC4XgdMDXyjs.dLC9jFNAuuNbFkL9udcXe/EBjxSyqxW // true // $2a$10$KbQiHKTa1WIsQFTQWQKCiujoTJJB7MCMSaSgG/imVkKRicMPwgN5i // true // $2a$10$5WfW4uxVb4SIdzcTJI9U7eU4ZwaocrvP.2CKkWJkBDKz1dmCh50J2 // true // $2a$10$0wR/6uaPxU7kGyUIsx/JS.krbAA9429fwsuCyTlEFJG54HgdR10nK // true // $2a$10$gfmnyiTlf8MDmwG7oqKJG.W8rrag8jt6dNW.31ukgr0.quwGujUuO // true for (int i = 0; i < 5; i++) { // "123456" - plain text - user input from user interface String passwd = encoder.encode("123456"); // passwd - password from database System.out.println(passwd); // print hash // true for all 5 iteration System.out.println(encoder.matches("123456", passwd)); } }
-
==============================
2.생성 된 암호는 소금에 절인 것이므로 다른 암호입니다.
생성 된 암호는 소금에 절인 것이므로 다른 암호입니다.
encode () 메소드에 대한 문서를 읽으면 암호가 소금에 절인 것으로 명시되어 있습니다.
-
==============================
3.BCryptPasswordEncoder는 소금을 사용하여 암호를 생성하기 때문에 완벽하게 정상입니다. 여기서 암호를 "소금으로 처리"하는 것에 대한 아이디어를 읽을 수 있습니다.
BCryptPasswordEncoder는 소금을 사용하여 암호를 생성하기 때문에 완벽하게 정상입니다. 여기서 암호를 "소금으로 처리"하는 것에 대한 아이디어를 읽을 수 있습니다.
이것은 encode 메소드에 대한 문서에서 말하는 것입니다.
-
==============================
4.두 번째 $ 바로 뒤에 오는 22 개의 문자는 소금 값을 나타냅니다 (https://en.wikipedia.org/wiki/Bcrypt#Description 참조). "Salt"는 해싱 이전에 암호에 추가 된 무작위 데이터이므로 주어진 매개 변수가있는 주어진 해시 알고리즘은 대부분 동일한 암호에 대해 다른 해시 값을 생성합니다 (무지개 공격에 대한 보호).
두 번째 $ 바로 뒤에 오는 22 개의 문자는 소금 값을 나타냅니다 (https://en.wikipedia.org/wiki/Bcrypt#Description 참조). "Salt"는 해싱 이전에 암호에 추가 된 무작위 데이터이므로 주어진 매개 변수가있는 주어진 해시 알고리즘은 대부분 동일한 암호에 대해 다른 해시 값을 생성합니다 (무지개 공격에 대한 보호).
원래 질문에 표시된 첫 번째 출력을 분석해 보겠습니다. $ 2a $ 10 $ cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi
소금과 해시 값은 모두 Radix-64를 사용하여 인코딩됩니다.
from https://stackoverflow.com/questions/25844419/spring-bcryptpasswordencoder-generate-different-password-for-same-input by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring에서 Lifecycle 인터페이스는 어떻게 작동합니까? "최상위 싱글 톤 빈"이란 무엇입니까? (0) | 2019.03.19 |
---|---|
[SPRING] Spring RestTemplate 사후 응답 (0) | 2019.03.19 |
[SPRING] 스프링 데이터 JPA - 주입이 실패합니다 - BeanCreationException : 필드를 자동 줄 바꿈 할 수 없습니다. (0) | 2019.03.19 |
[SPRING] Spring 캐시 가능 대 CachePut? (0) | 2019.03.19 |
[SPRING] 봄 부팅. 어노테이션으로 TaskExecutor를 만드는 방법? (0) | 2019.03.19 |