SPRING
2018.09.23 / 16:14

Spring¿¡¼­ ¼³Á¤ÆÄÀÏ(properties) ¾Ïȣȭ Çϱâ (with jasypt)

hangawee
Ãßõ ¼ö 189

Spring¿¡¼­ ¼³Á¤ÆÄÀÏÀ» °¨Ãß°í ½Í´Ù¡¦

Spring Framework¸¦ ÀÌ¿ëÇÏ¿© ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇÒ ¶§ µ¥ÀÌÅͺ£À̽º Á¤º¸³ª ±âŸ ¹Î°£ÇÔ Á¤º¸¸¦ ¼³Á¤ÆÄÀÏ¿¡ ÀÛ¼ºÇÏ°Ô µË´Ï´Ù.
¹°·Ð Java Config¸¦ »ç¿ëÇÏ°Ô µÈ´Ù¸é »ó°ü ¾øÁö¸¸, Àú´Â ÁÖ·Î application.yml(¶Ç´Â application.properties)À»(¸¦) »ç¿ëÇÕ´Ï´Ù.

¹®Á¦´Â ÀÌ ¼³Á¤ÆÄÀÏÀÇ °æ¿ì ¹èÆ÷ ½Ã ³ëÃâÀÌ µÇ¾î º¸¾È¿¡ ¹®Á¦°¡ »ý±æ ¼ö ÀÖ½À´Ï´Ù. (¹°·Ð Java Configµµ 100% ¾ÈÀüÇÑ °ÍÀº ¾Æ´ÏÁö¸¸¡¦)

±×·¡¼­ ÀÌ·± °í¹ÎÀ» ÇØ°áÇØ ÁÙ ¶óÀ̺귯¸®¸¦ Çϳª ¼Ò°³ÇÏ·Á ÇÕ´Ï´Ù.


Jsaypt(Java Simplified Encryption) ¸¦ ½áº¸ÀÚ

Jasypt´Â À§¿¡¼­ ¾ð±ÞÇß´ø ¹®Á¦¸¦ ÇØ°áÇØÁÖ´Â ÀÚ¹Ù ¶óÀ̺귯¸®ÀÔ´Ï´Ù.
Á» ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº Jasypt °ø½Ä ¹®¼­¸¦ È®ÀÎÇØÁÖ¼¼¿ä.

±×·³ ÀÌÁ¦ Jsaypt¸¦ »ç¿ëÇÏ´Â ¹ý¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.
À̹ø ¿¹Á¦¿¡ »ç¿ëÇÏ´Â SpringÀº Spring Boot 1.5.8.RELEASE ÀÌ°í, gradleÀ» »ç¿ëÇÕ´Ï´Ù.


1. Jsaypt¸¦ gradle¿¡ Ãß°¡Çϱâ

Spring boot¿¡¼­ jasypt¸¦ »ç¿ëÇϱâ À§Çؼ­´Â ¾Æ·¡ÀÇ ÀÇÁ¸¼ºÀ» gradleÀ» Ãß°¡ÇØÁÝ´Ï´Ù.

1.1 spring-boot-starter ¿ë

1
compile "com.github.ulisesbocchio:jasypt-spring-boot-starter:1.17"


1.2 @SpringBootApplication ¶Ç´Â @EnableAutoConfiguration ¸¦ »ç¿ëÇÏÁö ¾Ê´Â °æ¿ì

1
compile "com.github.ulisesbocchio:jasypt-spring-boot:1.17"

1.2 Ç׸ñ¿¡¼­´Â À§ gradleÀ» Ãß°¡ÇÑ ÀÌÈÄ ConfigurationŬ·¡½º¿¡ @EnableEncryptableProperties¸¦ Ãß°¡ÇØÁÝ´Ï´Ù.

Á» ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº ulisesbocchio Github¸¦ Âü°íÇϼ¼¿ä.


2. Config Ŭ·¡½º ÀÛ¼º

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Configuration
public class JasyptConfig {

@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("test"); //¾Ïȣȭ¿¡ »ç¿ëÇÒ Å° -> Áß¿ä
config.setAlgorithm("PBEWithMD5AndDES"); //»ç¿ëÇÒ ¾Ë°í¸®Áò
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}

¼³Á¤ Ŭ·¡½º¸¦ Çϳª ¸¸µé°í À§¿Í °°ÀÌ ÀÛ¼ºÀ» ÇÏ¿© jasyptStringEncryptor ºóÀ» ¸¸µé¾îÁÝ´Ï´Ù.


3. ¼³Á¤ÆÄÀÏ¿¡ Ãß°¡ [application.yml(¶Ç´Â application.properties)]

1
2
3
jasypt:
encryptor:
bean: jasyptStringEncryptor

¼³Á¤ÆÄÀÏ¿¡ À§ Ç׸ñÀ» Ãß°¡ÇØÁÝ´Ï´Ù.
bean¿¡´Â 2¹ø¿¡¼­ ÀÛ¼ºÇÑ beanÀÇ À̸§À» ÀÛ¼ºÇÕ´Ï´Ù.


4. ¾Ïȣȭ ÇÒ ³»¿ëÀ» ÀÛ¼º

ÀÌÁ¦ ¾Ïȣȭ ÇÒ µ¥ÀÌÅ͸¦ ¾Ïȣȭ ÇØ¾ß ÇÕ´Ï´Ù.
´Ù¾çÇÑ ¹æ¹ýÀÌ ÀÖÁö¸¸ ÀÏ´Ü °£ÆíÇÏ°Ô ºü¸£°Ô ¾²±â À§Çؼ­ Application¿¡ CommandLineRunner¸¦ È°¿ëÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÏ°Ú½À´Ï´Ù.

jasypt¿¡¼­ ´Ù¿î·Îµå ÈÄ java·Î Á÷Á¢ ½ÇÇàÇÏ´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
....(´Ù¸¥ ¼³Á¤ ¾î³ëÅ×À̼Ç)
@SpringBootApplication
public class Application implements CommandLineRunner {

public static void main(String [] args) {
SpringApplication.run(Application.class, args);
System.out.println("=========== Server Start ===========");
}

@Override
public void run(String... args) throws Exception {
StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
pbeEnc.setAlgorithm("PBEWithMD5AndDES");
pbeEnc.setPassword("test"); //2¹ø ¼³Á¤ÀÇ ¾Ïȣȭ Å°¸¦ ÀÔ·Â

String enc = pbeEnc.encrypt("1234"); //¾Ïȣȭ ÇÒ ³»¿ë
System.out.println("enc = " + enc); //¾Ïȣȭ ÇÑ ³»¿ëÀ» Ãâ·Â

//Å×½ºÆ®¿ë º¹È£È­
String des = pbeEnc.decrypt(enc);
System.out.println("des = " + des);
}
}

À§¿Í °°ÀÌ ÁøÇàÇÒ °æ¿ì ¾Ïȣȭ ÇÑ´Ù¸é ENC(fncHYmDe1oSFNFV8FcAEDa==) ¿Í °°Àº °ªÀÌ ³ª¿À°í º¹È£È­ ½Ã 1234°¡ Á¤»óÀûÀ¸·Î Ãâ·ÂµË´Ï´Ù.

ÀÌ·¸°Ô ¾Ïȣȭ ÇÒ ³»¿ëÀ» ¸¸µç ÈÄ ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÆÄÀÏ¿¡ ÀÛ¼ºÀ» ÇØÁÝ´Ï´Ù.

1
2
3
4
5
6
7
spring:
datasource:
sql-script-encoding: UTF-8
driver-class-name: org.mariadb.jdbc.Driver
url: ENC(fAcHYhDi1oSaAF8FcAEDQ==)
username: ENC(fncHYmDe8oSFAFV8FcAEDQ==)
password: ENC(Aqh1BctIkm9uBNolQ5xlSg==)

±×¸®°í ´Ù½Ã ¼­¹ö¸¦ ½ÇÇàÇغ¸¸é Á¤»óÀûÀ¸·Î ½ÇÇàµË´Ï´Ù.