Recent Posts
Recent Comments
Link
06-30 12:53
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

Spring Security Bcrypt 본문

DEV&OPS/Java

Spring Security Bcrypt

ALEPH.GEM 2022. 12. 12. 16:30

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