공부/그룹 스터디

[Spring]Jasypt 암호화

junani0v0 2024. 6. 21. 21:26

스터디

Jasypt 암호화

pom.xml에 Jasypt 라이브러리 적용

<!-- 암호화 -->
<dependency>
    <groupId>org.jasypt</groupId>
    <artifactId>jasypt-spring31</artifactId>
    <version>1.9.3</version>
</dependency>

pom.xml에 Jasypt 라이브러리 추가
(jasypt은 Spring 3.0까지 지원,jasypt-spring31은 Spring 3.1 이상을 지원)

암호화 사이트를 활용한 암호화

https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

스크린샷 2024-06-17 000648

간단하게 위 사이트를 사용하여 암호화 & 복구화가 가능

암호화

암호화는 사진의 왼쪽 붉은 부분을 입력

  • Enter Plain Text to Encrypt : 변환시키고 싶은 값을 입력
  • Select Type of Encryption : 복구화도 해야 하기에 Two Way ENcryption로 선택
  • Enter Secret Key : 암호화에 사용할 Key 값 입력
  • Encryption : 암호화
  • Jasypt Encrypted String : Encryption을 완료하면 암호화된 값이 생성됨

복구화

복구화는 사진의 오른쪽 오렌지 부분을 입력

  • Enter Jasypt Encrypted Text : 암호화된 값 입력
  • Select Action Type : Decryption Password로 선택
  • Secret Key Used during Encryption : 암호화에 사용한 Key 값 입력
  • Match/Decryption : 복구화
  • Result : 암호화로 변환시켰던 값 복구되어 생성

context-bean.xml Jasypt bean등록

<!-- Jasypt(암호화) Start -->
    <bean id="encryptorConfig" class="org.jasypt.encryption.pbe.config.EnvironmentPBEConfig">
        <!-- 사용할 암호화 알고리즘 -->
        <property name="algorithm" value="PBEWithMD5AndDES" />
        <property name="password" value="암호화에 사용한 Key값"/>
    </bean>

    <bean id="encryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
        <property name="config" ref="encryptorConfig" />
    </bean>

    <bean class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
        <constructor-arg ref="encryptor" />
        <property name="locations">
            <list>
                <!-- application.properties 파일 경로 -->
                <value>classpath:/application.properties</value>
            </list>
        </property>
    </bean>
<!-- Jasypt End -->

암호화값 사용

암호화된 값을 사용하는것은 기존에 사용하던곳에 ENC(암호화된 값)으로 바꿔 넣어주기만 하면됩니다

스크린샷 2024-06-17 003237


저는 application.properties를 만들어 그곳에 따로 값을 선언하고

<property name="username" value="${email.username}" />
<property name="password" value="${email.password}" />

이러한 형식으로 값을 가져와 사용하였습니다

암호화에 사용한 Key값 환경변수 등록(local)

스크린샷 2024-06-17 002139

 

스크린샷 2024-06-17 002218

암호화에 사용한 Key값이 전에는 노출되어 있기에 누구나 복구화가 가능하여 보안에 취약하였습니다
그렇기에 환경변수로 key값을 등록하여 외부노출을 차단해줍니다

Run > Run Configuration > 서버 선택 > Environment > add > name과 key값 등록 > apply

context-bean.xml Jasypt bean등록 수정

<!-- Jasypt(암호화) Start -->
    <bean id="encryptorConfig" class="org.jasypt.encryption.pbe.config.EnvironmentPBEConfig">
        <!-- 사용할 암호화 알고리즘 -->
        <property name="algorithm" value="PBEWithMD5AndDES" />
        <!-- 환경 변수를 사용하여 ASOG_ENCRYPTION_KEY 설정 -->
        <property name="passwordEnvName" value="ASOG_ENCRYPTION_KEY" />
    </bean>

    <bean id="encryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
        <property name="config" ref="encryptorConfig" />
    </bean>

    <bean class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
        <constructor-arg ref="encryptor" />
        <property name="locations">
            <list>
                <!-- application.properties 파일 경로 -->
                <value>classpath:/application.properties</value>
            </list>
        </property>
    </bean>
<!-- Jasypt End -->
<property name="passwordEnvName" value="ASOG_ENCRYPTION_KEY" />

key값을 대체할 환경변수에 등록한 이름을 넣어줍니다 이때 property이름password가 아닌 passwordEnvName로 변경해야합니다

원격 톰캣의 Jasypt 환경변수 설정

스크린샷 2024-06-19 131929


이클립스 상단 RUN > Run Configuration > Arguments >VM arguments > - Djasypt.encryptor.password=key값입력(그냥 타이핑하면 입력가능)

스크린샷 2024-06-17 002218

Arguments > Environment > add > Variable(Name) : 복구화키를 불러올 key값 입력, Value : 복구화키 입력 > apply

# 최종 경로 /usr/lib/jvm/java-11-amazon-corretto.x86_64

cd /usr/lib/jvm

java-11-amazon-corretto.x86_64가 있는 /usr/lib/jvm로 이동

java 환경변수 설정

vi ~/.bash_profile
  • vi : 텍스트 편집기
  • ~/ : 홈 디렉토리 경로
  • .bash_profile : 사용자 로그인 시 실행되는 스크립트 파일, 사용자의 환경 설정 및 사용자 정의 명령어등을 포함
i

insert모드로 들어가

JAVA_HOME=최종 경로

export path=$PATH:$JAVA_HOME/bin
JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto.x86_64

export path=$PATH:$JAVA_HOME/bin

Jasypt추가

JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto.x86_64
export APP_ENCRYPTION_PASSWORD=jun
export path=$PATH:$JAVA_HOME/bin

스크린샷 2024-06-19 132603

fi아래 최종경로 추가해서 추가
(띄어쓰기도 인식하니 조심)

:wq 
  • :wq : 저장 후 나가기
  • :q : 나가기
  • :q! : 강제 나가기
source ~/.bash_profile
  • source : 변경사항 즉시 적용
  • source ~/.bash_profile : 현재 셸 세션에서 .bash_profile 파일을 실행(자동로그인 실행되지 않음)

Jasypt 톰캣 환경변수 설정 - catalina.sh 파일을 수정

스크린샷 2024-06-19 133258

cd tools/apache-tomcat-9.0.89/bin > vi catalina.sh

스크린샷 2024-06-19 133211

/키워드+Enter : 원하는 키워드 검색, n을 누르면 다음 키워드 검색
/JAVA_OPTS > security위치에 JAVA_OPTS="$JAVA_OPTS -Djasypt.encryptor.password=복구화키값" > esc > :wq

tomcat start

톰캣 실행

 

 

< 제일 속을 썩였던....>

 

제일 많이 속을 썩게 만든 것은 Jasypt였습니다. 
보안을 위해 추가하였는데 이클립스에 환경 변수로 등록해서 local에서 사용하는 건 좋았지만, 배포 시 환경 변수로 등록하는 법을 잘 알지 못하여 고생하였습니다. 
또한 앞서 말한 부분들은 해결하였지만, 또다른 복병이 있었으니.... 그것은 jenkins.....
jenkins를 활용하여 Github에 연결하여 war파일을 만들엇지만, 배포에 리눅스로 Jasypt 환경변수를 등록하였음에도 이것을 읽어오지 못해 jenkins배포는 실패하여 아직 수정 중입니다.