본문 바로가기
6. 보안 Security

Vault Key를 사용하여 Data암호화 하기 - Java SDK

by primely 2022. 10. 3.

1. API Key생성하기

아래 링크참조

Link

2. Java SDK로 Vault Key 사용하여 Data암호화하기

> Maven Dependency

  <dependency>
    <groupId>com.oracle.oci.sdk</groupId>
    <artifactId>oci-java-sdk-encryption</artifactId>
  </dependency>

 

> Java Code

/* Vault를 사용하기 위한 Client객체 생성 
* - KmsVaultClient: Client에서 Vault정보를 접근
* - KmsManagementClient: Client에서 Vault에 대한 관리작업 수행
* - KmsCryptoClient: Client에서 암호화작업수행
*/
KmsVaultClient kmsVaultClient = new KmsVaultClient(provider);
kmsVaultClient.setRegion(Region.AP_SEOUL_1);
        
KmsManagementClient kmsManagementClient = new KmsManagementClient(provider);
KmsCryptoClient kmsCryptoClient = new KmsCryptoClient(provider);
// Vault객체
Vault vault = getVaultTest(kmsVaultClient, vaultId);
        
// Vault의 ManagementEndpoint와 CryptEndpoint설정
kmsManagementClient.setEndpoint(vault.getManagementEndpoint());
kmsCryptoClient.setEndpoint(vault.getCryptoEndpoint());

/* 암호화 수행 */
String plaintext = "I love OCI!";

// 암호화를 수행하기 위햔 Detail Data에 대한 정보설정
EncryptDataDetails encryptDataDetails =
    EncryptDataDetails.builder()
       .keyId(keyId)
       .plaintext(Base64.getEncoder().encodeToString(plaintext.getBytes()))
       .build();
// 암호화를 요청할 Request객체 생성
EncryptRequest encryptRequest = EncryptRequest.builder().encryptDataDetails(encryptDataDetails).build();
EncryptResponse response = kmsCryptoClient.encrypt(encryptRequest);
// 암호화된Text에 Data Key에 대한 정보가 포함되어 있다.
System.out.println("Ciphertext: " + response.getEncryptedData().getCiphertext());

/* 복호화 수행 */
DecryptDataDetails decryptDataDetails =
   DecryptDataDetails.builder()
       .ciphertext(cipherText)
       .keyId(keyId)
       .build();
DecryptRequest decryptRequest = DecryptRequest.builder().decryptDataDetails(decryptDataDetails).build();
DecryptResponse response = kmsCryptoClient.decrypt(decryptRequest);
String plainText = response.getDecryptedData().getPlaintext();
plainText = new String(Base64.getDecoder().decode(plainText.getBytes()), StandardCharsets.UTF_8);
        
System.out.println("Plaintext: " + plainText);

/* sign 수행 */
// MEK가 비공개키로 생성되어야 한다
// 개인키와 공개키를 OCI에서 가지고 있기 때문에 OCI에서 전송한 것을 부인방지하는데 사용될 수 있다.
SignDataDetails sd = SignDataDetails
               .builder()
               .keyId(keyId)
               .signingAlgorithm(SigningAlgorithm.Sha256RsaPkcs1V15)
               .message(Base64.getEncoder().encodeToString(plaintext.getBytes()))
               .build();
SignRequest signRequest = SignRequest.builder().signDataDetails(sd).build();
SignResponse response = kmsCryptoClient.sign(signRequest);
System.out.println("SignedData: " + response.getSignedData().getSignature());

/* verify 수행 */
VerifyDataDetails vd = VerifyDataDetails
                .builder()
                .keyId(keyId)
                .signingAlgorithm(SigningAlgorithm.Sha256RsaPkcs1V15)
                .message(Base64.getEncoder().encodeToString(plaintext.getBytes()))
                .signature(signature)
                .build();
VerifyRequest verifyRequest = VerifyRequest.builder().verifyDataDetails(vd).build();
VerifyResponse response = kmsCryptoClient.verify(verifyRequest);
System.out.println("SignatureValid: " + response.getVerifiedData().getIsSignatureValid());

 

소스코드 다운받기

 


작성자: 손창호(primelyson@gmail.com) / Cloud Engineer, 정보시스템감리사, DAP, PIA

개인의 시간을 할애하여 작성된 글로서 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다..

댓글