Programing/Security

Spring Springboot properties 암호화 jasypt 적용 방법, 설정파일 암호화

리커니 2022. 9. 30.
반응형

Spring Springboot properties 암호화 jasypt 적용 방법, 설정파일 암호화

 

properties 값을 암호화 하는 라이브러리인 jasypt 적용 방법을 알아보도록 하겠습니다.

springboot는 gradle, yml을 사용하고

spring은 maven, properties 를 사용하니 필요에 따라 확인하시기 바랍니다.

 

Springboot

jasypt-spring-boot-starter 를 의존성 주입합니다.

 

1. jasypt 의존성 주입

 

implementation group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '3.0.3'

 

config 파일을 작성합니다.

 

2. config 파일 작성

[JasyptConfig.java]

@Configuration
public class JasyptConfig {

    @Bean(name = "jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        final String key = "복호화키";
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(key);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setPoolSize("1");
        encryptor.setConfig(config);
        return encryptor;
    }
}

 

암호화를 하는데 필요한 기본적인 설정만 하였습니다.

Password - 암/복호화 키

Algorithm - 암/복호화 알고리즘

PoolSize - 암/복호화에 필요한 인스턴스 Pool Size, 0보다 크게 설정해야 함

 

SimpleStringPBEConfig 를 좀 자세히 보면

아래와 같은 옵션이 있습니다. 필요에 따라 설정하시면 될 것 같습니다.

 

private String algorithm = null;
private char[] password = null;
private Integer keyObtentionIterations = null;
private SaltGenerator saltGenerator = null;
private IvGenerator ivGenerator = null;
private String providerName = null;
private Provider provider = null;
private Integer poolSize = null;

/**
config.setKeyObtentionIterations("1000");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setStringOutputType("base64");
*/

 

이제 암호화 된 값을 확인해야 하는데 아래의 사이트로 이동하여 암호화된 값을 얻습니다.

 

3. 암호화 값 확인

 

Link : https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

 

Programming Blog Article Feeds as per your Interest | DevGlan

Best programming article feeds as per your Interest on different technologies. Subscribe to any technology and explore the best articles from around the web.

www.devglan.com

 

암호화할 값과 키를 아래와 같이 입력하고 결과를 확인합니다.

 

 

4. 암호화된 값 입력

 

암호화된 값과 복호화된 값이 일치하는지 확인합니다. 확인 후 jasypt bean을 연결하고 암호화된 값을 복사하여

properties 값에 입력을 합니다. ENC(W8MbNiiXQwSst8+OXWOsE4BQVTpxCl9E)

 

[application.yml]

#jasypt는 생략가능
jasypt:
  encryptor:
    bean: jasyptStringEncryptor
spring:
  datasource:
    url: 'jdbc:oracle:thin:@ip:port/sid'
    driver-class-name: 'oracle.jdbc.driver.OracleDriver'
    username: 'USER_NAME'
    password: ENC(W8MbNiiXQwSst8+OXWOsE4BQVTpxCl9E)

 

DB 접속을 확인합니다. 이상이 없으면 완료!

 

Spring

jasypt-spring-boot-starter 를 의존성 주입합니다.

 

1. jasypt 의존성 주입

 

<dependency>
    <groupId>org.jasypt</groupId>
    <artifactId>jasypt-spring31</artifactId>
    <version>1.9.2</version>
</dependency>

 

config 파일을 작성합니다.

 

2. config 파일 작성

[context-common.xml] - 여기서 값을 복호화 합니다.

<bean id="SimpleStringPBEConfig" class="org.jasypt.encryption.pbe.config.SimpleStringPBEConfig">
   <property name="password" value="암호화키" />
   <property name="algorithm" value="PBEWithMD5AndDES" />
   <property name="poolSize" value="1" />
</bean>
    
<bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.PooledPBEStringEncryptor">
   <property name="config" ref="SimpleStringPBEConfig" />
</bean>
    
<bean id="propertyConfigurer" class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
   <constructor-arg ref="configurationEncryptor" />
   <property name="locations">
       <list>
           <value>classpath:/properties/database.properties</value> 
       </list>       
   </property>
</bean>

 

위의 springboot 와 같이 옵션을 property 태그로 추가할 수 있습니다.

 

3. 암호화 값 확인

springboot와 동일한 방법이니 넘어가도록 하겠습니다.

 

4. 암호화된 값 입력

[database.properties]

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@ip:port/sid
username=USER_NAME
password=ENC(W8MbNiiXQwSst8+OXWOsE4BQVTpxCl9E)

 

[context-datasource.xml] - $ 를 사용해 불러옵니다.

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:/properties/database.properties</value>
        </list>
    </property>
</bean>

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
   <constructor-arg>
      <bean class="com.zaxxer.hikari.HikariConfig">
         <constructor-arg>
            <props>
               <prop key="jdbcUrl">${url}</prop>
               <prop key="username">${username}</prop>
               <prop key="password">${password}</prop>
            </props>
         </constructor-arg>
         <property name="driverClassName" value="${driver}"/>
         <property name="minimumIdle" value="5" />
         <property name="maximumPoolSize" value="10" />
         <property name="connectionTestQuery" value="select 1 from sys.dual" />
         <property name="connectionTimeout"  value="300000" />
      </bean>
   </constructor-arg>
</bean>

 

 

 

반응형

댓글

💲 추천 글