programing tip

Spring Security에서 새로운 PasswordEncoder를 사용하는 방법

itbloger 2021. 1. 8. 07:54
반응형

Spring Security에서 새로운 PasswordEncoder를 사용하는 방법


봄 보안 3.1.4.RELEASE로, 이전은 org.springframework.security.authentication.encoding.PasswordEncoder 더 이상 사용되지 찬성 org.springframework.security.crypto.password.PasswordEncoder. 내 애플리케이션이 아직 공개되지 않았기 때문에 더 이상 사용되지 않는 새로운 API로 이동하기로 결정했습니다.

지금까지 ReflectionSaltSource사용자의 등록 날짜를 암호에 대한 사용자 별 솔트로 자동으로 사용 하는 것이 있었습니다 .

String encodedPassword = passwordEncoder.encodePassword(rawPassword, saltSource.getSalt(user));

로그인 프로세스 동안 Spring은 사용자가 로그인 할 수 있는지 여부를 적절하게 확인하기 위해 내 빈을 사용했습니다. SHA-1의 기본 구현은 StandardPasswordEncoder전역을 추가 할 수있는 기능 만 있기 때문에 새 암호 인코더에서는이를 수행 할 수 없습니다. 인코더 생성 중 비밀 솔트.

더 이상 사용되지 않는 API로 설정하는 방법에 대한 합리적인 방법이 있습니까?


실제로 기존 형식으로 사용자를 등록하지 않은 경우 대신 BCrypt 암호 인코더 를 사용하도록 전환하는 것이 가장 좋습니다.

소금에 대해 전혀 걱정할 필요가 없기 때문에 번거 로움이 훨씬 적습니다. 세부 사항은 인코더 내에서 완전히 캡슐화됩니다. BCrypt를 사용하는 것은 일반 해시 알고리즘을 사용하는 것보다 강력하며 다른 언어를 사용하는 응용 프로그램과 호환되는 표준이기도합니다.

새 응용 프로그램에 대해 다른 옵션을 선택할 이유가 없습니다.


다음은 나를 위해 일하는 BCrypt의 구현입니다.

spring-security.xml에서

<authentication-manager >
    <authentication-provider ref="authProvider"></authentication-provider>  
    </authentication-manager>
<beans:bean id="authProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
  <beans:property name="userDetailsService" ref="userDetailsServiceImpl" />
  <beans:property name="passwordEncoder" ref="encoder" />
</beans:bean>
<!-- For hashing and salting user passwords -->
    <beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

자바 클래스에서

PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(yourpassword);

스프링 보안에 대한 자세한 예를 보려면 여기를 클릭하십시오.

이것이 도움이되기를 바랍니다.

감사


비슷한 문제가있었습니다. 사용자가 비밀번호를 변경하거나 재 등록하는 것을 원하지 않기 때문에 기존의 암호화 된 비밀번호 ( Base64 / SHA-1 / Random salt Encoded ) 를 유지해야했습니다 . 그러나 앞으로도 BCrypt 인코더 를 사용하고 싶었 습니다.

내 솔루션은 일치하기 전에 먼저 사용 된 암호화 방법을 확인하는 맞춤형 디코더를 작성하는 것이 었습니다 ( BCrypted 는로 시작 $).

솔트 문제를 해결하기 위해 수정 된 사용자 개체를 통해 연결된 솔트 문자열 + 암호화 된 암호를 디코더에 전달 합니다.

디코더

@Component
public class LegacyEncoder implements PasswordEncoder {

    private static final String BCRYP_TYPE = "$";
    private static final PasswordEncoder BCRYPT = new BCryptPasswordEncoder();

    @Override
    public String encode(CharSequence rawPassword) {

    return BCRYPT.encode(rawPassword);
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {

    if (encodedPassword.startsWith(BCRYP_TYPE)) {
        return BCRYPT.matches(rawPassword, encodedPassword);
    }

    return sha1SaltMatch(rawPassword, encodedPassword);
    }

    @SneakyThrows
    private boolean sha1SaltMatch(CharSequence rawPassword, String encodedPassword) {

    String[] saltHash = encodedPassword.split(User.SPLIT_CHAR);

    // Legacy code from old system   
    byte[] b64salt = Base64.getDecoder().decode(saltHash[0].getBytes());
    byte[] validHash = Base64.getDecoder().decode(saltHash[1]);
    byte[] checkHash = Utility.getHash(5, rawPassword.toString(), b64salt);

    return Arrays.equals(checkHash, validHash);
    }

}

사용자 개체

public class User implements UserDetails {

    public static final String SPLIT_CHAR = ":";

    @Id
    @Column(name = "user_id", nullable = false)
    private Integer userId;

    @Column(nullable = false, length = 60)
    private String password;

    @Column(nullable = true, length = 32)
    private String salt;

.
.

    @PostLoad
    private void init() {

    username = emailAddress; //To comply with UserDetails
    password = salt == null ? password : salt + SPLIT_CHAR + password;
    }        

또한 후크를 추가하여 새 BCrypt 형식으로 암호를 다시 인코딩 하고 바꿀 수 있습니다. 따라서 이전 방법을 단계적으로 제거합니다.


Having just gone round the internet to read up on this and the options in Spring I'd second Luke's answer, use BCrypt (it's mentioned in the source code at Spring).

The best resource I found to explain why to hash/salt and why use BCrypt is a good choice is here: Salted Password Hashing - Doing it Right.

ReferenceURL : https://stackoverflow.com/questions/17444258/how-to-use-new-passwordencoder-from-spring-security

반응형