티스토리 뷰
또 하나의 프로젝트가 끝나가고.. 보안 취약점 점검을 받게 되는데......
프로퍼티 파일에 DB Connection을 위해 접속 계정을 명시한 것이 걸렸다.
Jasypt를 이용하여 프로퍼티 암호화 적용하였는데, 그 방법을 정리하고자 한다.
1. Maven 의존성 추가
<!-- Properties Encryption -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
- maven 을 사용하고 있기에 아주 심플하게 의존성을 추가할수 있었다.
*아래 블로그에서 버전 3 이상에서는 오류가 있다고 하길래 안전하게 버전 2.1.2로 사용하였다.
2. JasyptConfig Class 작성, Main 클래스 어노테이션 추가
@Configuration
public class JasyptConfig {
@Value("${jasypt.encryptor.password}")
private String encryptKey; // 암호화된 프로퍼틴 값 가져오기
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor(){
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(encryptKey); // 암호화 키
config.setAlgorithm("PBEWithMD5AndDES"); // 대칭암호화
config.setKeyObtentionIterations("1000"); // 해싱을 반복할 횟수
config.setPoolSize("1"); // Encryptor를 클론하여 가지고 있을 갯수
config.setProviderName("SunJCE"); // Default 값
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // Salt를 생성하는 클래스
config.setStringOutputType("base64"); // 인코딩 값
encryptor.setConfig(config);
return encryptor;
}
}
- Jasypt 와 관련된 Config 를 작성한다.
@EnableEncryptableProperties //프로퍼티 암호화 명시
@SpringBootApplication
public class HeidiApplication {
public static void main(String[] args) {
SpringApplication.run(HeidiApplication.class, args);
}
}
- 메인 클래스에서 어노테이션을 통해 프로퍼티 암호화를 명시한다.
3. 프로퍼티 암호화
1) 아래 사이트에서 평문을 암호화문으로 만든다.
https://www.devglan.com/online-tools/jasypt-online-encryption-decryption
2) 프로퍼티 파일에 암호화문을 넣는다.
##DB 연결정보
##spring.datasource.url=jdbc:mysql://localhost/test
##spring.datasource.username=dbuser
##spring.datasource.password=dbpass
##spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=ENC(암호화문)
spring.datasource.username=ENC(암호화문)
spring.datasource.password=ENC(암호화문)
spring.datasource.driver-class-name=ENC(암호화문)
3) Jasypt 암호화 키를 설정한다.
- 문자열을 PBEWithMD5AndDES 알고리즘으로 암호화하려면 암호화키가 필요하다. PBEWithMD5AndDES 가 Jasypt의 Defalut 알고리즘으로, 다른 알고리즘으로 위에 생성한 Config 파일에서 변경가능하다.
PBEWithMD5AndDES알고리즘은 양방향 알고리즘, 대칭키 사용으로 Key 는 하나만 정하면된다.
(양방향 알고리즘: 복호화가 가능한 알고리즘, 대칭키: 암호화와 복호화 키가 동일한 키)
##Jasypt
jasypt.encryptor.bean=jasyptStringEncryptor
jasypt.encryptor.password=${JASYPT_PASSWORD}
jasypt.encryptor.property.prefix=ENC(
jasypt.encryptor.property.suffix=)
jasypt.encryptor.pool-size=1
프로퍼티 파일에 jasypt.encryptor.password 속성에 암호화키를 명시한다.
4. 암호화키 설정
암호화키는 평문으로 저장할수 밖에 없기에 분실하면 안되기도 하고 노출되지 않도록 관리해야한다.
로컬 개발환경에서는 IDE에 빌드시, 시스템 변수로 등록하고, 서버에서는 시스템변수로 등록하면된다.
예시로 인텔리제이와 Window 서버를 보겠다.
1) 인텔리제이에서 암호화키 설정
- Run - Edit Configurations... 클릭
- Environment variables에 프로퍼티 파일 jasypt.encryptor.password =${변수명} 로 작성했다면, "변수명=암호화키(평문)"을 입력하고 OK를 클릭하면된다.
- 그리고 Run을 해보면 설정한 암호화키를 이용하여 위에 명시했던 ENC() 내의 암호화문자열이 복호화 되며, 정상적으로 DB Connection이 수행된다.
2) Window 서버에서 암호화키 설정
인텔리제이에서 설정하는 것보다 더 쉽다.
Window서버에 시스템 환경변수(Window검색창에 시스템 환경변수 편집 검색한다. 안나오면 제어판에서 찾거나...내 PC>우클릭>속성에서 찾으면된다.) 에 그대로 변수명을 입력하고 암호화키를 입력하면 된다.
- 이렇게 해놓으면 나중에 Window서버 환경+Tomcat 환경에서 알아서 프로퍼티 파일에 환경변수가 매핑된다. 프로퍼티 파일에서 "${}" 문구가 시스템환경변수라는 의미임
여기까지 하면 프로퍼티 파일에서 DB 접속 비밀번호를 숨길수 있게 된다.
오퀘이 좋았어!
'FrameWork > Spring' 카테고리의 다른 글
JPA IDENTITY 전략에서 JdbcTemplate으로 Batch Insert/Update 하기, 그리고 성능 끌어올리기 (0) | 2022.12.23 |
---|---|
트랜잭션의 특성과 @Transactional의 noRollbackFor 옵션 (0) | 2022.12.23 |
REST API 버전관리 필요성과 그 방법 (0) | 2022.01.22 |
ElasticSearch 대신 OpenSearch 사용기, 그리고 예제 (3) | 2021.12.17 |
SQL Injection 서블릿 필터를 이용해 처리하기 - 2 (0) | 2021.07.13 |
- Total
- Today
- Yesterday
- 백준퇴사
- 백준
- html
- 프론트엔드
- 프론트엔드개발자
- 런타임에러
- 퇴사
- html꿀팁
- c#
- boj
- 개발중캐시삭제
- 선언적트랜잭션 #noRollbackFor #@Transactional
- C# java 차이점
- 백준14501
- script버전
- C++
- 캐시삭제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |