단순 텍스트에 비밀번호를 저장하는 것은 보안상 매우 취약하다. 기존의 MD5, SHA-1, SHA-2로 패스워드를 해싱할 수도 있지만 솔트를 치는것은 추가적인 보안을 만들 수 있다. 여기서 솔트를 친다는 말은 원문으로 이루진 비밀번호에 추가적인 문자열을 넣어서 해시를 강화한다고 이해하면 된다. 즉, 솔트를 지게 되면 같은 문자열로 부터 다른 해시 값이 생성된다.
jBCrpy는 패스워드를 인코딩할 때 내부적으로 랜덤 솔트를 생성하여 단순 텍스트를 인코딩하고 데이터베이스에 저장하게 된다.
위키에 따르면 bcrypt는 비밀번호 해시함수로 Niels Provos와 David Mazieres에 의해 만들어졌으며 Blowfish라는 암호에 기반하였다. Bcrypt는 조장할 수 있는 해시알고리즘을 써서 패스워드를 저장한다. Bcrypt는 패스워드를 해싱할 때 내부적으로 랜덤한 솔트를 생성하기 때문에 같은 문자열에 대해서 다른 이코드된 결과를 반환한다. 하지만 공통된 점은 매번 길이가 60인 String을 만든다.
Bcrypt 라이브러리는 단순 텍스트 패스워드를 해시하기 위한 이미 완성된 구현체를 쓰게 해준다.
private String hashPassword(String plainTextPassword) {
return BCrypt.hashpw(plainTextPassword, BCrypt.gensalt());
}
hashpw() 메서드는 단순 텍스트와 랜덤한 솔트를 인자로받는다.
다음 구현은 원문과 암호화된 패스워드를 매칭하는 부분이다.
private void checkPass(String plainPassword, String hasedPassword) {
if (BCrypt.checkpw(plainPassword, hasedPassword)) {
// doSomething();
}
}