spring의 PasswordEncoder 와 MySQL의 password()함수 호환성

Spring의 PasswordEncoder와 MySQL의 PASSWORD() 함수는 암호화 방식이 다르기 때문에 기본적으로 호환되지 않습니다. 두 기술은 서로 다른 알고리즘을 사용하며, 이를 통합하려면 커스터마이징이 필요합니다.

암호화 방식 비교

FeatureSpring PasswordEncoder (BCrypt)MySQL PASSWORD()
알고리즘 BCrypt
(기본적으로 강력한 해시 알고리즘과 솔트 사용)
SHA1(SHA1(password))
(SHA1 해시를 두 번 적용)
출력 형태 $2a$... 형식의 문자열 *FABE... 형식의 해시값
솔트 사용 여부 랜덤 솔트 포함 솔트 없음
복호화 가능 여부 불가능 (단방향 암호화) 불가능 (단방향 암호화)
 

Spring Security에서 제공하는 PasswordEncoder는 기본적으로 BCrypt를 사용하며, 이는 솔트를 포함해 암호화를 강화합니다12. 반면 MySQL의 PASSWORD() 함수는 SHA1 알고리즘을 두 번 적용하여 암호화된 값을 생성합니다34.

호환성을 위한 해결 방법

MySQL의 PASSWORD() 함수로 암호화된 값과 Spring Security의 PasswordEncoder를 호환하려면 다음과 같은 방법을 사용할 수 있습니다:

  1. Spring Security에서 MySQL PASSWORD() 구현체 사용:
    • Spring Security의 PasswordEncoder 인터페이스를 구현하여 MySQL의 PASSWORD() 함수와 동일한 방식으로 암호화를 수행하는 커스텀 클래스(MySqlPasswordEncoder)를 작성할 수 있습니다57.
    • 예:
public class MySqlPasswordEncoder implements PasswordEncoder {
    @Override
    public String encode(CharSequence rawPassword) {
        try {
            MessageDigest sha1 = MessageDigest.getInstance("SHA1");
            byte[] stage1 = sha1.digest(rawPassword.toString().getBytes());
            byte[] stage2 = sha1.digest(stage1);
            StringBuilder sb = new StringBuilder("*");
            for (byte b : stage2) {
                sb.append(String.format("%02x", b).toUpperCase());
            }
            return sb.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        return encode(rawPassword).equals(encodedPassword);
    }
}

 

  1. 데이터베이스 저장 방식 변경:
    • Spring Security에서 사용하는 암호화 방식(예: BCrypt)을 데이터베이스에 저장하도록 변경하고, 기존 MySQL PASSWORD() 값을 마이그레이션합니다6.
  2. MySQL에서 Spring Security와 동일한 알고리즘 사용:
    • MySQL에서 SHA256이나 다른 Spring Security와 호환 가능한 암호화 알고리즘을 사용하는 커스텀 함수를 작성하여 데이터베이스에 저장된 값과 일치하도록 설정합니다6.

 

 

'IT > Spring' 카테고리의 다른 글

spring boot 버전별 jdk 지원 버전  (2) 2025.03.27