스프링 시큐리티 암호화 모듈

Jaewoo Back·2024년 7월 12일
0

Spring Security공부

목록 보기
5/13
post-thumbnail

암호화

Encryptors 클래스는 대칭 암호화기를 생성하기 위한 팩터리 메서드를 제공합니다. 이 클래스를 사용하면 BytesEncryptor 인스턴스를 만들어 원시 형식의 데이터를 암호화 할 수 있습니다.

BytesEncryptor (바이트 암호화기)

팩토리 메소드를 사용해서 생성할 수 있습니다.

Encryptors.stronger("password", "salt");

암호화 방법은 256비트 AES 암호화를 사용하여 암호화기를 만듭니다. 솔트는 암호화된 데이터가 손상된 경우 키에 대한 사전 공격을 방지하는 데 사용됩니다.

제공된 salt는 16진수로 인코딩된 문자열 형식이어야 하며 임의적이어야 하며 길이가 8바이트 이상이어야 합니다.

String salt = KeyGenerators.string().generateKey(); 
// generates a random 8-byte salt that is then hex-encoded

TextEncryptor (텍스트 암호화기)

팩토리 메소드를 사용해 표준 TextEncryptor를 생성할 수 있습니다.

Encryptors.text("password", "salt");

암호 인코딩

spring-security-crypto PasswordEncoder는 중앙 서비스 인터페이스이며 다음과 같은 서명이 있습니다.

public interface PasswordEncoder {
	String encode(CharSequence rawPassword);
    
    boolean matches(CharSequence rawPassword, String encodedPassword);
    
    default boolean upgradeEncoding(String encodedPassword) {
    	return false;
    }
}

matches 메서드는 rawPassword가 인코딩되면 true를 반환합니다.


BCryptPassword 인코더

이 구현은 널리 지원되는 bcrypt알고리즘을 사용하여 암호를 해시합니다. bcrypt는 임의의 16바이트 솔트 값을 사용하며 암호 크래커를 방해하기 위해 의도적으로 느린 알고리즘입니다.

// Create an encoder with strength 16
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));


Pdkdf2PasswordEncoder 인코더

PBKDF2 알고리즘을 사용하여 암호를 해시합니다. 암호 크래킹을 무력화하기 위해 의도적으로 느린 알고리즘이며 시스템에서 암호를 확인하는 데 약 .5초가 걸리도록 조정해야 합니다.


// Create an encoder with all the defaults
Pbkdf2PasswordEncoder encoder = Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));

정리

Spring Security는 사용자 인증(로그인)시 비밀번호에 대해 단뱡향 해시 암호화 를 진행하며 저장되어 있는 비밀번호와 대조한다. 따라서 회원가입 시 비밀번호 항목에 대해서 암호화를 진행해야한다.

스프링 시큐리티는 암호화를 위해 BCrypt Password Encoder를 제공하고 권장한다. 따라서 해당 클래스를 return하는 메소드를 만들어 @Bean으로 등록하여 사용하면 된다.

Security Config 암호화 Bean 추가

public confing {
	...
    
    @Bean
    public BcryptPasswordEncoder bcryptPasswordEncoder() {
		return new BCryptPasswordEncoder();
	}
}
profile
https://blog.naver.com/jaewoo2_25

0개의 댓글