2014-11-12 1 views
0

나는이 질문에 스프링 보안을 사용하지만 지식은이 질문에 대답 할 필요가 없을 수도있다.블로우 피쉬 패스워드 확인

스프링 보안의 복어 암호화 클래스 (BCrypt)가 주어진 비밀번호를 어떻게 검증하는지 이해하려고합니다.

  1. BCrypt.hashpw(clearText, salt)으로이 소금을 사용 BCrypt.gensalt(10);
  2. 인코딩과 암호를 염을 생성 : 나는에 노력했다.

잘 돌아갔습니다. 그런 다음 사용자가 암호를 입력 할 때 재사용 할 수 있도록 데이터베이스에 사용 된 소금을 저장하려고했습니다.

암호를 확인할 때 BCryptPasswordEncoder이 소금을 사용하지 않는다는 것을 깨달았습니다.

public static void main(String[] args) { 
    String salt = BCrypt.gensalt(12); 
    String clearText="test"; 
    String hashed = BCrypt.hashpw(clearText, salt); 
    String reHashed = BCrypt.hashpw(clearText, hashed); 

    System.out.println("salt : " + salt); 
    System.out.println(hashed); 
    System.out.println(reHashed); 
} 

출력 :

salt : $2a$12$gzUymsNBoW.f1OfkLpb2se 
$2a$12$gzUymsNBoW.f1OfkLpb2seFZrniorawujSOp6Qe.PWDIHJvmYSP6y 
$2a$12$gzUymsNBoW.f1OfkLpb2seFZrniorawujSOp6Qe.PWDIHJvmYSP6y 

이 확인 보인다

public boolean matches(CharSequence rawPassword, String encodedPassword) { 
    [...] 
    return BCrypt.checkpw(rawPassword.toString(), encodedPassword); 
} 

그래서 나는이 코드 조각을 시도 : 대신, 소금 등의 해시 된 암호를 사용하여 암호를 지하실 그 :

good password => hashed = hash(clearPassword, hashed) 

잘못 이해하고 있습니까? 소금이 암호 확인에 쓸모가 없다는 뜻입니까? 따라서 데이터베이스에 소금을 저장할 필요가 없다는 뜻입니까?

답변

3

BCrypt는 반환하는 "해시"문자열의 일부로 소금을 저장합니다.
이 기능은 Bcrypt.* 함수에 의해 처리되므로 아무 것도 할 필요가 없습니다.

+0

답변 해 주셔서 감사합니다. BCrypt 구현과 관련된 '해쉬 된 (hashed)'과 '재 해쉬 (reHashed)'간의 동등성은 있습니까? –