Encryption types
- Symmetric Encryption (Shared), 대칭키
- Using the same key
- Asymmetric Encryption (RSA Keypair), 비대칭키
- Private and Public Key
- Usng Java keytool
- 인크립션과 디크립션에 서로 다른 키(Public Key, Pricate Key)가 사용된다.
- Public Key는 주로 암호화할 때, Private Key는 주로 복호화할 때 사용
Symmetric Encryption (Shared), 대칭키
config-service
의존성 추가
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
bootstrap.yml
User Microservice의 application.yml, bootstratp.yml을 수정 -> Config Server의 native-file-repo폴더의 user-service.yml로 이동
encrypt:
key: abcdefghijklmnopqrstuvwxyz0123456789
user-service.yml
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testDB
data-username: sa
data-password: 1234
User Microservice의 H2 Database의 Password를 encryption해서 저장
⭐data-password에 꼭!!!!! 작은 따옴표 안에 {cipher}을 적고 암호화된 값을 넣어야 한다!!
값을 웹에서 확인했을 때는 암호화된 값이 아니라 원래 값이 나온다.
서버 기동
주소창에 http://IP:user-service포트번호/h2-console
Password에 1234 넣으면 Test successful 뜬다.
Asymmetric Encryption (RSA Keypair), 비대칭키
Public Key, Pricate Key 생성 → JDK keytool 이용
폴더 생성
mkdir {user.home}/Desktop/Work/keystore
cmd
keytool -genkeypair -alias apiEncryptionKey -keyalg RSA
-dname "CN=Sein Lee, OU=API Development, O=joneconsulting.co.kr, L=Seoul, C=KR"
-keypass "test1234" -keystore apiEncryptionKey.jks -storepass "test1234"
생성된 키 자세히 알아보기
keytool -list -keystore apiEncryptionKey.jks -v
~~~~ 여기까지만 해도 좋다! ~~~
Public에 해당하는 Trust Server.cer 인증서 파일이 추출된다.
keytool -export -alias apiEncryptionKey -keystore apiEncryptionKey.jks -rfc -file trustServer.cer
인증서 파일을 다시 JDK파일로 바꿔서 사용할 수도 있다. (-keystore 변경시켜줄 파일 이름)
공개키 추출
keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks
생성된 키(public.jks) 자세히 알아보기
keytool -list -keystore publicKey.jks -v
처음에 만든 값(apiEncryptionKey)과 publicKey를 비교해보자.
뒤에 -v를 빼면 짧게 결과값이 나온다.
keytool -list -keystore publicKey.jks
keytool -list -keystore apiEncryptionKey.jks
apiEncryptionKey, publicKey, TrustServer 총 3개가 생성된 것을 볼 수 있다.
Spring Cloud Configuration Server에서는 apiEncryptionKey 하나만 있으면 된다...
ls -al
적용해보자
config-service
bootstrap.yml
encrypt:
# key: abcdefghijklmnopqrstuvwxyz0123456789 # 이건 대칭키일 때 사용
key-store:
location: file:///${user.home}/Desktop/MSA_STUDY/keystore/apiEncryptionKey.jks
password: test1234
alias: apiEncryptionKey
postman에서 암호화 진행
1234를 암호화 했음.
암호화한 .yml에 넣어준다.
웹에서는 1234라고 잘 나온다
gateway-service의 token secret도 비대칭키를 적용해보자
비대칭 키 적용
웹에서 확인
디버그 모드에서 확인
user-service와 gateway-service에서 공통적인 부분이 있다면 공통적으로 해결하는게 좋다.
위에는 연습삼아 따로 적용했지만,
아래 사진을 보면 application.yml을 공통적으로 사용하는 것을 확인할 수 있다.
💬 혼잣말
- Public Key는 주로 암호화할 때, Private Key는 주로 복호화할 때 사용
강의에서는 apiEncryptionKey만 사용했는데
apiEncryptionKey, publicKey, TrustServer 키를 생성해서 어떻게 사용하는지 까지 해봐야겠다..