github에 프로젝트를 올리려고 했는데, 생각해보니 그대로 올리면 DB정보같은 게 200% 문제가 될 것 같았다.
그래서 어떻게든 DB관련 정보를 숨기기로 했다.
라이브러리
https://github.com/ulisesbocchio/jasypt-spring-boot
라이브러리 추가
https://mvnrepository.com/artifact/org.jasypt/jasypt
https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter
나는 Gradle을 이용하기 때문에 build.gradle에 의존성을 추가해준다. Maven을 쓸 땐 pom.xml에 추가하면 됨.
나는 작업 당시 가장 최신버전을 사용했지만 달리 원하는 버전이 있다면 사용해도 무관
dependencies {
// https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter
compile group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '3.0.3'
// https://mvnrepository.com/artifact/org.jasypt/jasypt
compile group: 'org.jasypt', name: 'jasypt', version: '1.9.3'
}
[프로젝트명]Application.java
package com.blah.test;
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//아래 어노테이션이 중요
@EnableEncryptableProperties
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
암호화
방법1) 프로그램으로 암호화
@SpringBootTest
class EncodingApplicationTests {
@Test
void contextLoads() {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("사용할password"); //암호화, 복호화할 때 사용할 패스워드
encryptor.setAlgorithm("PBEWithMD5AndDES");
encryptor.setStringOutputType("base64");
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=UTF-8";
String username = "test";
String password = "test123"; //패스워드를 test123으로 지정
String urlResult = encryptor.encrypt(url);
String usernameResult = encryptor.encrypt(username);
String passwordReesult = encryptor.encrypt(password);
System.out.println("url plain : " + encryptor.decrypt(urlResult)); //복호화
System.out.println("url encoding : " + urlResult); //암호화 (설정파일에 사용)
System.out.println("username plain : " + encryptor.decrypt(usernameResult));//복호화
System.out.println("username encoding : " + usernameResult); //암호화 (설정파일에 사용)
System.out.println("password plain : " + encryptor.decrypt(passwordReesult));//복호화
System.out.println("password encoding : " + passwordReesult); //암호화 (설정파일에 사용)
}
}
결과)
url plain : jdbc:mysql://localhost:3306/find_animal?serverTimezone=UTC&characterEncoding=UTF-8
url encoding : BB2oEp6njcRRwuQYZH8vFi2Iu35yBGSV5lDJrr/mZdcSLfy+j+H7G+5yshnuP4ZmrrB+/KIJ7ArLw6ScZMbzd5YK6nWVtM4GqSCneiJ+DdvxP4iRhVREYcI3cqBVaUFf
username plain : test
username encoding : JPgjry4UObmNMw+kiOuVdA==
password plain : test123
password encoding : 23eeT+r5SiJfrS9FzN7g6Q==
방법2) 사이트에서 암호화
아래 사이트에서 Two Way Encryption(With Secret Text) 로 암호화하기
https://www.devglan.com/online-tools/jasypt-online-encryption-decryption
PropertiesConfig.java
@Configuration
public class PropertiesConfig {
/**
* jasypt 비밀번호
*/
@Value("${jasypt.encryptor.password}")
private String password;
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(password); //암호화, 복호화할 때 사용할 패스워드
config.setAlgorithm("PBEWithMD5AndDES"); //암호화 알고리즘
config.setKeyObtentionIterations("1000"); //해시 반복 횟수
encryptor.setConfig(config);
return encryptor;
}
}
application.yaml
나는 yaml을 사용해서 application.yaml 에 작성했지만, application.properties 를 사용하시면 거기에 입력하시면 됨.
spring:
datasource:
url: ENC(BB2oEp6njcRRwuQYZH8vFi2Iu35yBGSV5lDJrr/mZdcSLfy+j+H7G+5yshnuP4ZmrrB+/KIJ7ArLw6ScZMbzd5YK6nWVtM4GqSCneiJ+DdvxP4iRhVREYcI3cqBVaUFf)
username: ENC(JPgjry4UObmNMw+kiOuVdA==)
password: ENC(23eeT+r5SiJfrS9FzN7g6Q==)
driver-class-name: com.mysql.cj.jdbc.Driver
Boot Run
Environment variables에 jasypt.encrytor.password=사용한 패스워드 키 를 추가하고 실행한다.
yaml파일에 명시해주지 않았기 때문에 위의 값을 추가해줘야 @Value("${jasypt.encryptor.password}") 를 사용할 수 있다.
우분투에서 톰캣을 사용하여 서버 올릴 때에는 아래 포스팅 참고
2021.06.23 - [리눅스] - 리눅스 서버 구동 시 환경변수 넘기기 [Linux, Ubuntu, Tomcat]
'자바' 카테고리의 다른 글
Autowired해줬는데도 NullException뜰 때 [Java, Spring Boot] (0) | 2024.02.19 |
---|---|
스프링 부트 스케쥴러 생성 [Java, Spring Boot, Scheduler] (0) | 2021.06.23 |
로그인 성공, 실패 핸들러 작성 feat. 로그인 실패 시 alert 띄우기 [Java, Spring Security] (0) | 2021.06.23 |
백엔드에서 카카오 맵 API 요청하기 [Java, REST API, Kakao Map] (0) | 2021.06.23 |