SSCM
SSCM(Spring Security Crypto Module)은 키 생성(Key generators)과 암호화 및 복호화 기능(Encryptors)을 포함한다.
이 모듈은 보안 관점에서 중요한 데이터 보호를 돕기 위해 다양한 암호화 및 해시 기능을 제공한다.
이들에 대해 알아보자.
Key generators
Key generators는 암호화 혹은 해싱 알고리즘에 필요한 특정 종류의 키를 생성하는 데 사용되는 객체이다.
키를 생성하는 인터페이스는 아래 두 가지가 있다.
- StringKeyGenerator
- BytesKeyGenerator
StringKeyGenerator
StringKeyGenerator의 모습은 아래와 같다.
public interface StringKeyGenerator {
String generateKey();
}
generateKey()를 활용하면 8Byte 키를 생성하고 이를 16진수 문자열로 인코딩해 String형으로 반환한다.
따라서 salt를 아래와 같이 얻을 수 있다.
StringKeyGenerator keyGenerator = KeyGenerators.string();
String salt = keyGenerator.generateKey();
BytesKeyGenerator
BytesKeyGenerator는 아래와 같다.
public interface BytesKeyGenerator {
int getKeyLength();
byte[] generateKey();
}
generateKey()로 Key 값을 얻을 수 있고 getKeyLength()로 키의 길이를 얻을 수 있다.
Key의 길이를 다르게 지정하려면 아래와 같이 구현하면 된다.
BytesKeyGenerator keyGenerator = KeyGenerators.secureRandom(16);
secureRandom()는 호출할 때마다 새로운 키 값을 가지는 BytesKeyGenerator 인스턴스를 반환한다.
만약 동일한 키 값을 가지는 인스턴스를 반환받고 싶다면 shared()를 사용하면 된다.
BytesKeyGenerator keyGenerator = KeyGenerators.shared(16);
Encryptors
데이터가 이동할 때 이를 암호화해야 하는 경우가 많다. 이러한 경우 사용하면 유용하다.
Encryptors를 활용해 암호화 및 복호화를 하는 방법을 알아보자.
위의 Key generator와 유사하게 Encryptor 방법도 두 가지가 있다.
- TextEncryptor
- BytesEncryptor
TextEncryptor
public interface TextEncryptor {
String encrypt(String text);
String decrypt(String encryptedText);
}
TextEncryptor는 데이터를 문자열로 관리한다. 입력도 문자열, 반환도 문자열이다.
TextEncryptor는 세 가지 주요 유형이 있다.
- Encryptors.text(): AES 암호화를 사용하며 암호화 방식으로 CBC 모드를 사용한다.
- Encryptors.delux(): 더 강력한 AES 암호화를 사용하며 암호화 방식으로 GCM을 사용한다.
- Encryptors.noOpText(): 암호화를 수행하지 않는다. 주로 성능 테스트 등에 사용한다.
아래는 이를 활용한 코드이다.
String salt = KeyGenerators.string().generateKey();
String password = "secret";
String valueToEncrypt = "HELLO";
TextEncryptor e = Encryptors.text(password, salt);
String encrypted = e.encrypt(valueToEncrypt);
String decrypted = e.decrypt(encrypted);
BytesEncryptor
public interface BytesEncryptor {
byte[] encrypt(byte[] byteArray);
byte[] decrypt(byte[] encryptedByteArray);
}
BytesEncryptor는 데이터를 byte 배열로 관리한다.
아래는 이를 활용한 코드이다.
String salt = KeyGenerators.string().generateKey();
String password = "secret";
String valueToEncrypt = "HELLO";
BytesEncryptor e = Encryptors.standard(password, salt);
byte [] encrypted = e.encrypt(valueToEncrypt.getBytes());
byte [] decrypted = e.decrypt(encrypted);
Encryptors.standard()는 기본 암호화로 256-bit AES-encryption을 사용한다.
강력한 암호화 기능을 제공하는 Encryptors.stronger()도 있다.
BytesEncryptor e = Encryptors.stronger(password, salt);
두 method는 BytesEncryptor 인스턴스를 반환한다.
'Java > Spring' 카테고리의 다른 글
Spring Security - PasswordEncoder (0) | 2024.06.14 |
---|---|
Spring Security - UserDetails, UserDetailService (1) | 2024.06.12 |
Spring Security - Spring Security 겉핥기 (0) | 2024.06.11 |
Spring Security - Spring Security를 공부하는 이유 (1) | 2024.06.04 |