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를 호환하려면 다음과 같은 방법을 사용할 수 있습니다:
- Spring Security에서 MySQL PASSWORD() 구현체 사용:
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);
}
}
- 데이터베이스 저장 방식 변경:
- Spring Security에서 사용하는 암호화 방식(예: BCrypt)을 데이터베이스에 저장하도록 변경하고, 기존 MySQL PASSWORD() 값을 마이그레이션합니다6.
- MySQL에서 Spring Security와 동일한 알고리즘 사용:
- MySQL에서 SHA256이나 다른 Spring Security와 호환 가능한 암호화 알고리즘을 사용하는 커스텀 함수를 작성하여 데이터베이스에 저장된 값과 일치하도록 설정합니다6.
'IT > Spring' 카테고리의 다른 글
spring boot 버전별 jdk 지원 버전 (2) | 2025.03.27 |
---|