Java/Spring

Spring Security - SSCM

Dlise 2024. 6. 15. 20:06

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 인스턴스를 반환한다.