property 암/복호화를 위한 Jasypt 적용기 -2-

Ssol·2022년 6월 29일
0
post-thumbnail

문제 발생!!

이전 글에 썼던대로 프로퍼티 암/복호화를 할 때 기존 Jasypt 알고리즘이 아닌 PBEWithSHA256And128BitAES-CBC-BC를 사용하니 로컬에서는 아주 잘 작동하는데, 테스트 서버에 올려보니 복호화가 안되는 문제 발생…

왜지??🧐

검색해보니 Jasypt 3.0.0 이후 버전 부터 기본 알고리즘이 바뀌면서 알고리즘 차이로 인한 문제가 자주 발생한 것처럼 보인다.

GitHub - ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot

jasypt 버전 업데이트 정보를 확인해보니

  • 3.0.0 버전 부터 PBEWithMD5AndDESPBEWITHHMACSHA512ANDAES_256로 알고리즘 변경이 됨
  • 하지만 복호화시 알고리즘 이슈, 기존 적용 시스템 알고리즘 유지 등의 이유로 기존 알고리즘을 많이 사용하는 것 같더라

해결 방법

jasypt 버전을 2.0번대로 낮추면 해당 이슈가 발생하지 않는다고 하는데 그렇게 하기는 싫어서 3.0번대를 유지하면서 해결할 방법을 찾았다.

jasypt:
	encryptor:
		algorithm: PBEWithMD5AndDES
		iv-generator-classname: org.jasypt.iv.NoIvGenerator

위 깃헙 링크에 있는 버전 업데이트 정보에는 3.0.0 이상에서 기존 알고리즘을 그대로 사용하기 위해서는 yml에 다음 속성을 사용해야 한다고 한다.

알고리즘과 iv 제네레이터 클래스네임을 property로 받아와야 한다면

jasypt:
    encryptor:
    	algorithm: PBEWithMD5AndDES
    	iv-generator-classname: org.jasypt.iv.NoIvGenerator
    	password: ${JASYPT_PASSWORD}

이참에 패스워드도 추가해 외부 환경변수로 주입받아 property로 사용하기로 했다.

환경변수로 받는 여러 방법들

docker-compose로 환경변수 주입하기

우리 회사 테스트 서버와 운영 서버는 docker-compose로 돌리고 있으므로
docker-compose로 환경변수 파일(.env)파일을 주입받아 외부에서 패스워드 키 값을 받아오도록 했다.

back:
    image: back
    container_name: back
    ports:
            - 10000:10000
    volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - /[로그를 저장할 경로]/logs:/[로그를 저장할 볼륨 경로]/logs

            ... [기타 해당 컨테이너 볼륨 경로들]

    env_file: ./back/my-back/.env
    networks:
            - default
            - backend
    restart: always

env_file로 환경파일이 있는 경로를 잡아주도록 하자.

JASYPT_PASSWORD=password

해당 경로에 .env 파일을 위와 같이 만들어주고

package com.openeg.openegscts.utils;

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
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
@EnableEncryptableProperties
public class JasyptConfigDES {

    @Bean("jasyptEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();

        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);

        return encryptor;
    }
}

SimpleStringPBEConfig 클래스를 생성해 yml파일에 있는 데이터를 제외한 config 설정을 채워주면 되는데
yml에 사용 알고리즘과 패스워드, iv generator class name은 입력했으니 이것들을 제외한 나머지 설정을 config 파일에 세팅해주면 된다.

이 세팅을 PooledPBEStringEncryptor에 setConfig로 넣어주면 준비 끝!!

기존 버전에 쓰던 알고리즘을 사용하므로 다음 링크를 이용해 패스워드 키만 알고 있으면 온라인 암/복호화도 가능하고 서버에서도 password를 환경파일로 받아와 잘 작동하게 된다.

.env파일은 까먹지말고 꼭 gitignore 처리를 해주자!!!


위 방법 말고도 어떤 것이 있을까?
만약 로컬에서 컨테이너가 아닌 백엔드 단일 프로젝트로 돌린다면 ??

Mac 시스템 환경변수 설정하기

시스템에 환경변수를 박아넣어서 시스템에서 직접 불러오게 하는 방법이 있다.
물론 Windows, Mac, Linux 모두 가능하다.
나는 주로 Mac을 사용하므로 Mac의 시스템 환경변수로 패스워드를 받아오도록 해보겠다.

터미널에 env를 입력하면 mac의 시스템 환경변수를 확인할 수 있다.

# Mac 환경변수 확인
env

이 환경변수를 수정하거나 추가하는 방법은 home경로에 있는 .bash_profile에서 환경변수를 수정하거나 추가해주면 되는데

# 환경변수 등록하는 파일 열기(open으로 열어도 되고, vi나 vs code로 열어도 상관 없다.)
open .bash_profile

환경변수를 추가하는 방법은 export를 사용하면 된다.

# .bash_profile 파일 내부에
# JASYPT_PASSWORD라는 환경변수에 password라는 문자열을 할당
export JASYPT_PASSWORD="password"

그리고 터미널 재시작

만약 이렇게 하고도 환경변수 조회에서 새로 등록한 환경변수가 보이지 않는다면 .zprofile에도 등록을 해주면 된다.

# 위 순서로 환경변수를 등록했는데도 env로 새로 등록한 환경변수가 확인 안된다면
## .zprofile을 열어서 .bash_profile에 새로 등록했던 환경변수를 똑같이 추가해주면 된다.
open .zprofile

# .zprofile 파일 내부에
# JASYPT_PASSWORD라는 환경변수에 password라는 문자열을 할당
export JASYPT_PASSWORD="password"

터미널을 재시작 후 환경변수를 조회해보면 새로 등록해준 환경변수가 나오는 것을 볼 수 있을것이다.

env로 환경변수 확인 결과

컨테이너 환경변수 주입하기

만약 로컬에서 그냥 프로젝트를 돌리는 것도 아니고 compose를 사용하지 않으면서 컨테이너만 사용해서 실행을 한다면 컨테이너를 올릴 때 환경변수를 주입해주는 방법이 있다.

docker run -d -p 8080:8080 -e [환경 변수]=[] [docker image]:[tag]

이렇게 docker run을 할 때 -e 또는 —env 옵션을 사용해서 환경변수를 주입해줄 수 있다.


이것 외에도 터미널에 직접 환경 변수를 export 하여 재부팅하면 사라지는 일회성 환경변수를 만들어 넘기는 등 여러 방법들이 있는데 적절한 방법을 찾아서 사용하면 된다.

프로퍼티 암호화… 참 쉽죠?😎

profile
Junior Back-end Developer 🫠

0개의 댓글