JASYPT를 이용하여 application.yml 파일 암호화 하기 (feat. Spring boot)

2.5*2 하빈·2024년 5월 29일
2
post-thumbnail

오오오오... 프로젝트를 진행하면서

공개 Repository에 push를 하는 경우가 있다!

근데, application.yml 파일이 같이 올라간다면?

팀원이나 프로젝트 관리자나 개발자 친구나 뭐 등등 당신에게 말할 것이다

yml 파일을 그냥 그대로 올리면 안된다

절.대

프로젝트의 내부 설정인데 왜 남에게 보여주는 것인가..?

자 그래서 방법이 있다

  1. yml 파일 자체를 .gitignore 한다

  2. JASYPT 라이브러리를 사용한다.

오늘은 JASYPT 라이브러리를 사용해서 application.yml 파일을 암호화해보자!


1 - gradle 의존성 추가

아 근데 JASYPT란 무엇인가...

이것부터 알아보고 가자

JASYPT (Java Simplified Encryption)는
Java 애플리케이션에서 복잡한 설정 없이 쉽게 데이터를 암호화할 수 있도록 도와주는 라이브러리입니다.
이 라이브러리는 개발자들이 보다 간단하게 암호화 기능을 자신의 프로젝트에 통합할 수 있도록 설계되었습니다.
주로 데이터베이스 정보, 사용자 비밀번호, 기타 민감한 정보의 저장과 전송 시 이를 안전하게 암호화하여 보안을 강화하는 데 사용됩니다.

  • 주요 기능
  1. 다양한 알고리즘 지원!
    사용자가 자신의 요구 사항에 맞는 암호화 방식을 선택할 수 있습니다.

  2. 커스터마이징
    기본 설정 외에도 자신의 필요에 맞게 암호화 알고리즘의 매개변수를 조정할 수 있습니다.


자! 이제 해보자

먼저 Spring boot build.gradle 가서 아래 의존성을 추가한다.

// ⭐ Jasypt
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'

2 - Config 작성

  • 먼저 Config 생성을 하자


  • 자 이제 코드를 작성해볼까요?
@Configuration
@EnableEncryptableProperties
public class JasyptConfig {

    @Value("${jasypt.encryptor.key}")
    String key;

    @Bean(name = "jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {

        // PooledPBEStringEncryptor 인스턴스 생성: 성능 향상을 위해 풀(pool)을 사용하는 암호화기
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        
        // SimpleStringPBEConfig 인스턴스 생성: 암호화 구성을 위한 설정 객체
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();

        // 암호화 키 설정: 암호화와 복호화에 사용될 비밀 키 설정
        config.setPassword(key);

        // 암호화 알고리즘 설정: MD5 해싱과 DES 암호화를 결합한 PBE 알고리즘 사용
        config.setAlgorithm("PBEWithMD5AndDES");

        // 키 생성 반복 횟수 설정: 보안 강화를 위해 키 생성 과정에서 수행할 반복 횟수
        config.setKeyObtentionIterations("1000");

        // 풀 크기 설정: 동시에 수행될 수 있는 암호화 작업의 수를 1로 설정
        config.setPoolSize("1");

        // 암호화 제공자 설정: Java Cryptography Extension (JCE)의 SunJCE를 사용
        config.setProviderName("SunJCE");

        // 소금 생성기 클래스 설정: 암호화 시 사용할 소금을 무작위로 생성하는 클래스 지정
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");

        // 문자열 출력 형식 설정: 암호화된 데이터의 출력 형식을 base64로 설정
        config.setStringOutputType("base64");

        // 암호화기에 구성 설정 적용: 위에서 정의한 설정을 암호화기에 적용
        encryptor.setConfig(config);

        // 설정된 암호화기 반환: 외부에서 사용할 수 있도록 설정된 암호화기 객체 반환
        return encryptor;
    }
}

3 - .yml 파일 생성 및 작성

  • JASYPT KEY 저장할 .yml 파일을 생성합니다!


  • 자 이제 .yml 에서 bean과 key 값을 적어볼까요?
jasypt:
  encryptor:
    bean: jasyptStringEncryptor
    key: 원하는 키 값

위에 사진 색깔에서도 볼 수 있듯이
반드시 application-key.yml 은 공개 repository에 올리시면 안됩니다!!!


4 - .yml 암호화 하기

  • 그럼 이제 Spring boot 에서의 설정은 끝났고!
    암호화를 하러 가볼까요?

우선 암호화를 하기 위해서 암복호화를 지원하는 Site에 접속해봅시다.
Jasypt Encryption and Decryption Online


우선 .yml 파일에서 아래와 같은 내용이 있다고 해봅시다!

JWT 토큰 정보는 암호화를 반드시 해야겠죠?

jwt:
  # HS512 알고리즘을 사용함. 해당 알고리즘은 key 값이 최소 512bit 여야함. 따라서 [secret-key]는  64byte 이상이어야 한다.
  secret: example key
  token:
    # 접근 토큰 시간: 12시간 (60*60*12*1000 =43200000)
    access-expiration-time: 43200000
    #갱신토큰시간: 3일  (60*60*24*3*1000=259200000)
    refresh-expiration-time: 259200000

자 이제 사이트에 들어가서 example key 라는 값을 암호화 해봅시다!

Enter plain text to Encrypt : 숨기고 싶은 값 (암호화 하려는 값)
Select Type of Encryption : Two Way Encryption
Secret Key To Be Used While Encryption : 암호화에 쓰이는 KEY 값


  • 자 이제 암호화를 진행했으니 JWT 토큰 key 값을 숨겨볼까요?
jwt:
  # HS512 알고리즘을 사용함. 해당 알고리즘은 key 값이 최소 512bit 여야함. 따라서 [secret-key]는  64byte 이상이어야 한다.
  secret: ENC(K7hNPqPPlVy3ADhDEOH3CDLsZjoRA6T2)
  token:
    # 접근 토큰 시간: 12시간 (60*60*12*1000 =43200000)
    access-expiration-time: 43200000
    #갱신토큰시간: 3일  (60*60*24*3*1000=259200000)
    refresh-expiration-time: 259200000

ENC() 로 감싸서 괄호 안에 암호화된 값을 넣으면 됩니다!


암호화 하고 싶은 모든 값을 이제 암호화! 할 수 있겠네요!

추가로 인텔리제이 안에서 따로 설정할 수 있는 방법도 있는데요!
이건 뭐.. 취향 차이~!

여튼 오늘은 암호화 하는 방법을 살펴봤습니다 ㅎㅎ

오늘도 한층 더 성장하는 하루였습니다...

개발 과정이 하나부터 열까지 쉽지가 않죠...

근데 뭐 어쩔거야

알죠?

ㅋㅋ 견뎌

profile
끝내주는 남자

0개의 댓글