More

java maven 환경에서 bcrypt 적용 (스프링시큐리티x)

bcrypt

java maven 환경에서 bcrypt를 적용하려고 검색해보니 대부분 스프링 프레임워크 시큐리티를 사용해 적용하고 있어 스프링이 아닌 일반 java 환경에서 어떤 라이브러리를 써야 하나 고민 했습니다.


1. at.favre.lib bcrypt 선택

maven repository 사이트에서 한참을 검색하다 찾은 at.favre.lib bcrypt 라이브러리로 적용하기로 결정. 주기적으로 업데이트도 되고 있고 (마지막 업데이트는 2023년 12월) github에 공개도 되어 있어 이걸로 선택하기로 했습니다.


2. bcrypt 적용

maven dependency (마지막 버전인 10.2 적용)

<!-- https://mvnrepository.com/artifact/at.favre.lib/bcrypt -->

<dependency>

    <groupId>at.favre.lib</groupId>

    <artifactId>bcrypt</artifactId>

    <version>0.10.2</version>

</dependency>


2. bcrypt 사용 방법

사용 방법은 굉장히 간단합니다.

암호화를 적용할 땐 아래와 같이 BCrypt.withDefaults().hashToString 메서드를 적용. 해시값은 60바이트로 표시됩니다.


String enterPw = "test1234!"  
BCrypt.withDefaults().hashToString(12, enterPw.toCharArray());
// 해시값 : $2a$12$tcW6Rx.aEizQoa.NKTfIhO6tQT2dJq5znYuJqlhpIHVd0WhKdrBK.


해시값에 나오는 내용 중 첫번째는 $2a는 Bcrypt 알고리즘 버전을 나타내고 뒤에 $12 부분은 문자열을 생성하는 동안 사용된 솔트 라운드를 의미합니다. 

hashToString 첫번째 인자값으로 넣는 12가 여기에 해당되며 값을 크게 넣을 수록 해시 시간이 늘어납니다. 12를 넣는다고 secureRandom을 사용 안 하는거 아니냐고 생각할 수 있는데 넣는 값만 12로 들어갈 뿐이지 소스 코드를 보면 사용하고 있습니다.

at.favre.lib bcrypt
secureRandom을 사용하고 있습니다

암호화를 적용했던 패스워드와 사용자가 입력한 패스워드를 비교할 땐 BCrypt.verifyer().verify 메서드를 적용해서 비교합니다.


String enterPw = "test1234!"
BCrypt.Result result = BCrypt.verifyer().verify(enterPw.toCharArray(), dbPassword);
return result.verified; // true, false 리턴

사용자 입력 값과 DB에 저장된 패스워드를 비교해 true, false 를 리턴합니다.