2016-08-24 4 views
1

내 응용 프로그램에 스프링 보안을 사용하고 있습니다. 사용자가 처음 등록 할 때 암호는 BCryptPasswordEncoder으로 암호화됩니다.BCryptPasswordEncoder에서 원래 암호를 얻는 방법

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); 
String hashedPassword = passwordEncoder.encode(password); 

이제 암호 변경의 경우, 사용자는 현재 암호를 입력하고 나는이 현재 암호가 데이터베이스에 저장되어있는 암호화 된 암호에 대한 동일 여부를 확인해야합니다.

동일한 문자열로 동일한 암호화 된 해시를 BCryptPasswordEncoder과 함께 생성 할 수 없다는 것을 알고 있습니다. 따라서 암호가 같은 경우 암호를 비교하는 유일한 방법은 데이터베이스에 저장된 원래 암호를 가져 와서 현재 입력 된 암호와 비교하는 것입니다.

암호를 비교하거나 데이터베이스 암호 해시 암호에서 원래 암호를 가져 오는 방법이 있습니까?

답변

3

원시 비밀번호와 db의 인코딩 된 비밀번호 만 확인하면됩니다. 예를 들어,

BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); 
String p = bCryptPasswordEncoder.encode("SomeCoolPassword"); 
System.out.println(bCryptPasswordEncoder.matches("SomeCoolPassword", p)); 
+0

훌륭한 해결책이지만, 제 경우에는 실제로 느립니다. 그러한 검증 방법을 (anywhery, dorin 'login'등) 그런 검증 방법을 사용하면 전체 실행 시간의 84 % (!!!)를 (profiler로 테스트 한) 취한 다음, 어떤 방법으로 그것을 입증 할 필요가 있습니다 (확실하게 bcrypt는 디자인,하지만 그 검사가 최적화되지 않은 것 같습니다) –

+0

@AlexEfimov, 나는 실제 시간과 configs보다는 전체 실행 시간의 %를보고 싶습니다. 그 이유는 상대적으로 중요하지 않은 시간의 84 %도 중요하지 않기 때문입니다. 이 특정 작업은 느리지 만 성능과 보안은 반대 요구 사항이며 요구 사항이 까다로운 거래를 요구할 수도 있습니다. 몇 가지 웹 응용 프로그램에서이 정확한 코드를 로그인 용으로 사용하며 문제가 없습니다. [또한 일부 정보에 대해이 허용 된 대답을 살펴보십시오] (https://security.stackexchange.com/questions/17207/recommended-of-rounds-for-bcrypt). – ChiefTwoPencils

2

예, passwordEncoder은 동일한 해시를 생성하지 않습니다,하지만 당신은 그들을 비교할 수 있으며,이 같은 문자열에서 생성 된 경우, true를 돌려줍니다. 내 예를 확인 :

public class Test { 
    public static void main(String[] args) { 
     BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); 
     List<String> passwords = Arrays.asList(bCryptPasswordEncoder.encode("testPassword"), 
       bCryptPasswordEncoder.encode("testPassword"), 
       bCryptPasswordEncoder.encode("testPassword"), 
       bCryptPasswordEncoder.encode("testPassword")); 

     passwords.stream() 
       .filter(e -> bCryptPasswordEncoder.matches("testPassword", e)) 
       .forEach(e -> System.out.println(true)); 
    } 

}

을하고 난 4 true를 얻을.

관련 문제