Encrytion & Decription

duckbill413·2024년 8월 5일
0

Spring Cloud

목록 보기
10/10
post-thumbnail

Encrytion & Decription

Tech: Cloud
최종 편집 일시: 2024년 7월 20일 오후 6:39

  • Symmetric Encryption (Shared) - 대칭키
    • Using the same key
  • Asymmetric Encryption(RSA Keypair) - 비대칭키
    • Private and Public Key
    • Using Java keytool

서버에 아래의 POST 요청을 통해 암호화, 복호화 요청을 보낼 수 있다.

  • {{base-uri}}/encrypt: 암호화
  • {{base-uri}}/decrypt: 복호화
  • {cipher} 이라는 문구를 암호화된 문자열 앞에 붙여주면 Config Server 가 암호화된 문자열인 것을 인식하게 된다.

Symmetric Encryption

  • Spring Config Server 에서 Encryption, Decription 요청
  • Database 정보를 암호화 및 Config Server 를 활용
  1. dependency 추가

    // https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap
    implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
  2. Config Server 의 application.yml 와 동일한 위치에 bootstrap.yml 파일 추가

    encrypt:
      key: Pl0YADvlwQNbNzyzu1jhFQxm52aUm0KpQYosvNfEXbosfx2UyF
    • 데이터 암호화를 위한 Key 값 추가
  3. Postman 을 이용하여 Database password 암호화

  4. User Service 의 application.yml 의 Database 정보 삭제

    spring:
      application:
        name: user-service
      h2:
        console:
          enabled: true
    #  datasource:
    #    url: jdbc:h2:mem:testdb
    #    driver-class-name: org.h2.Driver
    #    username: sa
    #    password: 1234
  5. User Service 의 bootstrap.yml의 정보 수정

    Config Server에서 읽어오는 정보를 변경 (config-serveruser-service)

    spring:
      cloud:
        config:
          name: user-service
          uri: http://127.0.0.1:8888
  6. config-server가 환경 정보를 읽어오는 파일을 수정

    spring:
      datasource:
        url: jdbc:h2:mem:testdb
        driver-class-name: org.h2.Driver
        username: sa
        password: "{cipher}8da2dc81d9224a5f14db816e22202dce088d6a3d2d68b3e7a9ba88c8eeb1e912"
    
    token:
      expiration_time: 86400000
      secret: native-jGCgrTB9PGo7dtQCjOC18iCNQNlW8PWooUKb0k5GgSFUGMDKT2_changed#2
    
    gateway:
      ip: 192.168.0.15
    
    • 위의 POSTMAN 의 요청으로 얻어온 암호화된 값을 password 에 사용
    • password에 사용할때 앞에 {cipher} 을 추가
  7. Config Server에서 Decryption이 되었는지 확인

    • spring.datasource.password를 보면 암호화하기 이전의 값으로 디코딩된 것을 확인

Asymmetric Encryption

  1. Public, Private Key 는 서로 다르게 생성 → JDK keytool 이용

  2. $ mkdir ${user.home}/Desktop/Work/keystore 폴더 생성 (편한곳)

  3. keytool 의 key 생성 명령을 이용하여 key 생성

    keytool -genkeypair -alias apiEncryptionKey -keyalg RSA -dname "CN=duckbill, OU=API Development, O=duckbill.co.kr, L=Seoul, C=KR" -keypass "1q2w3e4r" -keystore apiEncryptionKey.jks -storepass "1q2w3e4r"
  4. Key 생성 확인

    keytool -list -keystore apiEncrytionKey.jks -v
  5. 생성된 Key 를 이용하여 공개키 생성

    keytool -export -alias apiEncryptionKey -keystore apiEncrytionKey.jks -rfc -file trustServer.cer
  6. 생성된 공개키를 이용하여 다시 jks Key 생성

    keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks
    키 저장소 비밀번호 입력:
    
    새 비밀번호 다시 입력:
    
    keytool 오류: java.lang.Exception: 입력이 X.509 인증서가 아닙니다.
  7. Config Server 의 bootstrap.yml 변경

    비대칭키 위치를 지정

    encrypt:
    #  key: Pl0YADvlwQNbNzyzu1jhFQxm52aUm0KpQYosvNfEXbosfx2UyF
      key-store:
        location: file:///${user.home}/native-file-repo/keystore/apiEncryptionKey.jks
        password: 1q2w3e4r
        alias: apiEncryptionKey
  8. Config Server에 POST 요청을 통해 키를 암호화

  9. Config Server 의 환경 변수 수정

    spring:
      datasource:
        url: jdbc:h2:mem:testdb
        driver-class-name: org.h2.Driver
        username: sa
        password: "{cipher}8da2dc81d9224a5f14db816e22202dce088d6a3d2d68b3e7a9ba88c8eeb1e912"
    
    token:
      expiration_time: 86400000
      secret: "{cipher}AQBwAX+GLjXF0QKD9lJxJx2Z+VhBFMkrb5Jv/KjB94qIdpsExjPkofkV70mpivRhECmu5YiXQ5xRRTeF3Tw/WTPhIr28MY+kEbffwQ0xW1xtnZt/9DeXLyJDoANHHJuC8WCtGg9+jFAZbAfOTIj2kMqOi8puUBSK4pe57PJbrc9gK/xGtyqGKluiEi+6g4LRZQoajw4S3l0yMOaHrbpNpFWsejQXyznBSovpagR4CNdZXU7n8gM1R7qDgH2SueqnpiSpmJtjt1RkdPK/24OENRzrnCpYrF2pAIiyxXzo90AmCh5GmA5uLtYbGiCUrGner8OsYqvUt45ukP5bbuX/XGfEWcS1WMLGTi21+67phOJsAcWIAox7i1NnZwgh4hSlekA="
    
    gateway:
      ip: 192.168.0.15
    
profile
같이 공부합시다~

0개의 댓글