2017-11-08 5 views
2

MD5 (기존 항목)와 BCrypt 비밀번호가 모두 포함 된 사용자 테이블이 있습니다. 브루투 포스없이 MD5 암호를 BCrypt로 마이그레이션하고 싶습니다. 성공적인 인증을 위해 암호를 다시 암호화하는 방법에 대해 생각했습니다.스프링 보안 - 인증시 명확한 비밀번호 가져 오기 및 다시 암호화

erase-credentialsauthentication-manager 선언으로 사용 중지하면 암호를 알아낼 수 있습니다 (로그인 페이지에서). 이 경우 내 사용자 지정 AuthenticationSuccessHandler뿐 아니라 내 응용 프로그램의 어느 곳에서도 자격 증명 정보에 액세스 할 수 있습니다 (SecurityContextHolder.getContext().getAuthentication() 사용).

인증에 성공한 경우에만 암호를 해독 할 수 있습니까? 아니면 사용자 조작 (비밀번호 변경 등)을 요구하지 않고 비밀번호를 다시 암호화하는 더 좋은 방법을 알고 있습니까?

이 솔루션은 기존의 MD5 해시 새로운, 더 나은 (BCrypt) 인코더 값을 모두 받아들이는 암호 인코더를 만드는 것입니다, 그리고 하나를 찾을 때 MD5 해시를 마이그레이션하면

답변

0

감사드립니다.

@Component 
public class MigratingPasswordEncoder implements PasswordEncoder { 

    @Autowired 
    private org.springframework.security.crypto.password.PasswordEncoder passwordEncoder; // new encoder (BCrypt) 

    @Autowired 
    private Md5PasswordEncoder legacyEncoder; 

    @Autowired 
    private UserDao userDao; // where password hashes are stored 

    public String encodePassword(String rawPass, Object salt) { 
     return passwordEncoder.encode(rawPass); 
    } 

    public boolean isPasswordValid(String encPass, String rawPass, Object salt) { 
     if (legacyEncoder.isPasswordValid(encPass, rawPass, salt)) { 
      // MD5 hash found here, save a new hash instead 
      userDao.updatePassword(encPass, passwordEncoder.encode(rawPass)); 
      return true; 
     } 
     return passwordEncoder.matches(rawPass, encPass); 
    } 
} 

중단 참고 :이 org.springframework.security.authentication.encoding 패키지의 이전 PasswordEncoder 인터페이스를 사용하지만, Md5PasswordEncoder는,이 인터페이스를 사용하기 때문에 이후 꽤 피할 수 없다.

크레딧 : 답변에서 영감을 받아 Spring security 3.1.4 and ShaPasswordEncoder deprecation.