github에 올릴 경우 개인정보가 노출되면 안되기 때문에 정보를 숨겨야 한다.
github에 빼고 올리던지 암호화를 시켜 올려야 하는데, jasypt 라이브러리를 이용해 암/복호화할 수 있다.
다음 페이지에 들어가면 spring boot 에서 어떻게 사용할 수 있는지 나와있다.
https://github.com/ulisesbocchio/jasypt-spring-boot
GitHub - ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot
Jasypt integration for Spring boot. Contribute to ulisesbocchio/jasypt-spring-boot development by creating an account on GitHub.
github.com
1. 먼저 dependency에 boot버전과 맞는 버전을 추가해준다.
// maven
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
// gradle
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3'
2. config 폴더에 JasyptConfig를 만들어 주고, bean으로 등록한다.
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JasyptConfig {
private final String password = "password"; // 암복호화에 사용되는 키
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(password);
config.setAlgorithm("PBEWithMD5AndTripleDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
3. application.yml 설정 파일에 bean 이름을 적어준다
jasypt:
encryptor:
bean: jasyptStringEncryptor
# property:
# prefix: ENC(
# sufix: )
4. JasyptTest를 만들어서 암호화할 문자열을 넣고 암/복호화 한다.
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
public class JasyptConfigTest {
final private String passwrod="암호화키"
@Test
public void jasyptTest(){
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(passwrod);
//config.setPassword("환경변수에 저장된 JASYPT_PASSWORD 값(jasypt의 password)");// 암호화 복호화에 필요한 키
config.setAlgorithm("PBEWithMD5AndTripleDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
String plainText = "암호화 되어야 하는 값";
String encryptedText = encryptor.encrypt(plainText);
String decryptedText = encryptor.decrypt(encryptedText);
System.out.println("Enc: " + encryptedText);
System.out.println("Dec: " + decryptedText);
assertThat(plainText).isEqualTo(decryptedText);
}
}
그런데 암/복호화하는데 필요한 키인 password가 그대로 노출되면 암호화하는 의미가 없다.
그래서 vm option에 추가하던지 환경변수로 등록해놓고 사용하는 방식이 있다.
5-1. vm option에 추가해서 사용하기
run > edit configuration > 해당프로젝트선택 > vm option에 아래 추가
-Djasypt.encryptor.password=암호화키
JasyptConfig에서 private final String password = "password"; 부분을 변경해주자.
@Value("${jasypt.encryptor.password}")
private final String password;
5-2 혹은 환경변수를 사용하자
시스템 환경 변수 편집 을 검색 > 환경변수 > 시스템변수
JASSYPT_PASSWORD 으로 변수를 지정하고, 암호화키 값을 저장
환경변수 값을 가져오는 방법은 yml에서 지정하는 방식, config에서 가져와 지정하는 방식이 있는데
우선 yml에서 바로 지정하려면 ${ JASYPT_PASSWORD }
jasypt:
encryptor:
bean: jasyptStringEncryptor
password: ${JASYPT_PASSWORD}
# algorithm: PBEWithMD5AndTripleDES
# property:
# prefix: ENC(
# sufix: )
두번째로 JasyptConfig파일에서 환경변수 가져오는 법
config.setPasswrod( System.property("JASYPT_PASSWORD") );
- yml에서 다시 config로 가져오려면 아래처럼 하면 된다.
@Value("${jasypt.encryptor.password}")
private final String password;
6. 마지막으로 test에서 성공한 encrypted text를 설정파일에서 ENC() 로 감싼 후 바꿔주면 된다.
password: ENC(OGJewJfwejfFFEWOFs963bDGJWP)
그런데 문제가 있었다.
vm option을 추가하는 방식은 전혀 되지 않았고, 환경변수 등록하는 방식은 ENC()로 감싸진 비밀번호를 해독하지 못했다. 또 해독을 못한다는 오류가 뜨지 않으면 로그인이 되지 않았다.
jasypt에서 3.0.4 버전이 spring boot 2.5.4를 지원한다고 했고, 3.0.0부턴 boot 2.1.x 버전을 지원한다.
내 boot 버전은 2.6.x 였다. 뇌피셜론 버전이 안맞는게 문제인것 같기도 하다.. 그렇지만 강한 확신이,,,
그래서 일단은 정보가 있는 파일을 ignore에 추가해 두었다.
낮은 버전에서 다시 시험해보고 결론을 내려야 겠다.. 아직 확인된건 아니니 취소선 그어놔야지ㅜ
/*** 현재 jasypt와 spring boot 버전 호환이 되지 않아* ENC() 내의 문자열 해독 불가 -> 버전 업그레이 되면 적용하기* 조치: .gitignore 파일에 application-dev.yml을 등록*/
'spring | spring boot' 카테고리의 다른 글
AWS 아마존웹서비스 educate 계정 달라짐 (0) | 2022.12.18 |
---|---|
SpringBoot thymeleaf rest api 게시판 model값 주고받기 (0) | 2022.12.09 |
springboot-개발환경 분리하기 application.yaml (0) | 2022.03.24 |
JSON object, array parsing (0) | 2022.02.15 |
SpringBoot 의존성 주입 DI, 필드주입@Autowired ->생성자주입@RequriedArgsConstructor (0) | 2022.02.15 |
댓글