spring

spring-boot application.properties DB접속 정보 암호화

질주하는구 2022. 3. 21. 15:56

spring-boot 사용 중 DB접속 정보(계정, 비밀번호)를 application.properties에 등록 하는 경우 

해당 정보를 암호화 해야 하는 경우가 있습니다.(개인적으로 진행하는 프로젝트가 아니라면 무조건 암호화를 해줘야 합니다.)

 

jasypt를 이용해서 관련 작업을 진행 할 수 있는데 build.gradle 에 관련 의존성을 추가 해줍니다.

 

implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
implementation 'org.bouncycastle:bcprov-jdk15on:1.61'

암호화 관련 설정시 사용할 정보를 application.properties에 아래와 같이 추가 해주고

jasypt.encryptor.password=mypassword
jasypt.encryptor.algorithm=PBEWithMD5AndDES
jasypt.encryptor.property.prefix=ENC[
jasypt.encryptor.property.suffix=]

사용 하고자 하는 정보를 아래의 소스를 참고해 암호화 해줍니다.

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); 
SimpleStringPBEConfig config = new SimpleStringPBEConfig(); 
config.setPassword("mypassword"); 
config.setAlgorithm("PBEWithMD5AndDES"); 
config.setKeyObtentionIterations("1000"); 
config.setPoolSize("1"); 
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); 
config.setStringOutputType("base64"); 
encryptor.setConfig(config); 

String plainText = "test"; // 암호화 할 내용
String encryptedText = encryptor.encrypt(plainText); // 암호화
String decryptedText = encryptor.decrypt(encryptedText); // 복호화
System.out.println("Enc:"+encryptedText+", Dec:"+decryptedText);

해당 결과를 database관련 설정의 value로 등록 해주고

spring.datasource.username=ENC[ZKu/LKf9DyGnJPAXqWW7uQ==]
spring.datasource.password=ENC[kXjtcrMkTLitu2n0Y+1vdA==]

위의 설정처럼 ENC[] 으로 값을 감싸 줍니다.(해당 정보를 기준으로 암호화 여부를 결정 하게 됩니다. 기본 설정은 ENC()입니다.)

서비스 시작시 해당 정보를 복호화 할 class를 아래와 같이 추가 해주면

@Configuration
@EnableEncryptableProperties
public class PropertyEncryptConfig {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());

	public static final String JASYPT_STRING_ENCRYPTOR = "jasyptStringEncryptor";
		
	@Value("${jasypt.encryptor.password}") 
	private String encryptKey;

	@Value("${jasypt.encryptor.algorithm}") 
	private String algorithm;
	
	@Bean(JASYPT_STRING_ENCRYPTOR) 
	public StringEncryptor stringEncryptor() { 
		logger.info("encryptKey: "+encryptKey);
		logger.info("algorithm: "+algorithm);
		
		StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); 
		SimpleStringPBEConfig config = new SimpleStringPBEConfig(); 
		config.setPassword(encryptKey); 
		config.setAlgorithm(algorithm); 
		config.setKeyObtentionIterations("1000"); 
		config.setPoolSize("1"); 
		config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); 
		config.setStringOutputType("base64"); 
		encryptor.setConfig(config); 
		
		logger.info("end");
		
		return encryptor;
	}
}

설정한 정보가 복호화 되서 접속 하게 됩니다.

아래는 작업시 참고한 블로그 입니다. 

https://derveljunit.tistory.com/339

 

[Spring & Boot][2.6.2] 스프링 프로퍼티 암복호화 Jasypt 예제

스프링부트 2.6.2 버전을 기준으로 작성되었습니다. 예제 Github 주소 https://github.com/Derveljun/derveljun-jasypt-example GitHub - Derveljun/derveljun-jasypt-example Contribute to Derveljun/derveljun-..

derveljunit.tistory.com

https://www.baeldung.com/spring-boot-jasypt

 

반응형