삶 가운데 남긴 기록 AACII.TISTORY.COM
Spring Security Bcrypt 본문
Bcrypt 사용 예
maven이나 gradle로 관련 라이브러리를 추가 후 아래와 같이 사용합니다.
String pw = "pw1234!";
//실제 데이터베이스에 저장될 패스워드의 해시값
String hashed = BCrypt.hashpw(pw, BCrypt.gensalt());
//입력된 패스워드와 해시되어 저장된 패스워드를 비교
boolean isValid = BCrypt.checkpw(pw, hashed);
salt
해시된 패스워드를 저장한 테이블인 Rainbow Table 을 이용한 해킹 공격을 막기 위하여 랜덤 생성한 salt값을 더한 뒤 다시한 번 해시 값을 얻어서 Rainbow Table 을 이용한 공격을 막습니다.
Bcrypt 해시 값의 예
$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa
위의 해시값을 해석해보면 $문자로 구분된 3가지 파트로 이루어져있음을 알 수 있습니다.
$2a는 bcrypt 알고리즘 버전을 의미합니다.
그 다음 $10은 2의 10승 번 만큼 salt 값을 더하고 다시 해시 값을 구하는 과정을 반복한다는 의미입니다.
그 다음 $ 이후 22글자가 salt 값인데 16바이트로 디코딩 되어 해시값을 구할 때 사용됩니다.
나머지 문자 값들이 최종 패스워드의 해시 값을 의미합니다.
salt 값은 왜 노출 되어 있는 가?
salt 값의 존재 의의는 Rainbow Table 을 이용한 공격을 막는데에 있습니다.
salt값을 사용하면 salt값의 노출 여부와 관계없이 Rainbow Table은 무용지물이 됩니다.
왜냐하면 salt값을 알아냈다 하더라도 다시 Rainbow Table을 새로 만드는데 시간이 매우 오래 걸리기 때문입니다.
728x90
'DEV&OPS > Java' 카테고리의 다른 글
java.lang.ClassNotFoundException: sun.misc.GC 오류 (0) | 2022.12.19 |
---|---|
이클립스 주석 템플릿 예제 (0) | 2022.12.15 |
JAVA 콘솔 application 리눅스 실행 시 참고 사항 (0) | 2022.11.07 |
JAVA 코딩 컨벤션 (0) | 2022.10.20 |
JAVA 스레드 없이 지연 sleep() 시키기 (0) | 2022.09.07 |