Spring 에서는 설정 파일에 들어가는 JDBC 접속 정보(ID, Password)를 평문이 아닌 암호문을 입력하여 접속정보를 일부 보호할 수 있는 암호화 기능을 제공하고 있다. 이 글에서는 jasypt 라이브러리를 이용한 암호화를 구현해본다.
간단히 말하면 Java, Spring 등에서 암복호화를 지원해주는 오픈소스라고 할 수 있다. 개발자 입장에서는 최소한의 코드로 암복호화를 사용할 수 있는 것이다!
먼저, bean으로 등록하기 위해 별도 클래스를 만들고 @Configuration을 달아보자
@Configuration
public class JasyptConfig {
@Value("${jasypt.encryptor.password}")
private String password; // 암호화 시 사용될 키 값
그리고 @Bean 을 선언하여 실제로 암/복호화를 적용할 함수를 만든다.
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(password); // 암호화 키 값
config.setAlgorithm("PBEWithMD5AndDES"); // 암호 알고리즘
config.setKeyObtentionIterations("1000"); // PBE 해쉬 횟수
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
위에서 사용된 값들은 기본 값으로 사용되며, 변경이 가능하다.
프로그램 기동 시 암호화 적용을 위해 해당 bean을 설정 파일에 명시해야하며 아래와 같이 설정 할 수 있다.
jasypt:
encryptor:
property:
bean: jasyptStringEncryptor
당연한 얘기지만, 설정 파일의 암호화 값을 입력하기 위하여 jasypt 라이브러리를 이용하여 암호화 값을 얻어야 한다. 암호화 방법은 아래와 같다.
public void getEnc() {
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
standardPBEStringEncryptor.setAlgorithm("PBEWithMD5AndDES");
standardPBEStringEncryptor.setPassword("TEST_KEY");
String enc = standardPBEStringEncryptor.encrypt("password123");
System.out.println("Encrypted Password is : "+ enc);
}
도출한 암호화 값을 properties 또는 yml에 있는 jdbc 입력란에 암호화 값을 ENC()으로 감싸 입력한다.
db.driver=com.mysql.jdbc.Driver
db.url=ENC(dA5m1XXzMMqixudUjoPtve6hSrKnNgDnG6yXytBcnoSzPx46zNl32Q7y1gvI3jMB)
db.username=ENC(X3scraZNomhTtGD8QAndPw==)
db.password=ENC(eGaAQsn3ejXTMusZjl78sg==)
보안 요구사항이 나날이 필요해지는 시대에 이런 잡기술은 필수이다!!