AWS kms사용기#2

KMS를 통해 키 생성, 암호화/복호화 하는 방법

1.CMK

1) IAM 유저 권한 설정

  • KMS를 통해 키를 생성하기 위해서는 별도의 권한이 필요하다.
  • 기본으로 제공해주는 policy에서는 제공하지 않고 있다.
  • 다음과 같은 custom policy 생성 { “Version”: “2012-10-17”, “Statement”: { “Effect”: “Allow”, “Action”: [ “kms:”], “Resource”: “” } }

2) CMK 키 생성 코드

  // KMS Client 생성 및 리전 선택
  AWSKMSClient kms = new AWSKMSClient(credentials).withRegion(Regions.AP_NORTHEAST_2);

  // CMK 키 생성 요청   
  String desc = "Customer Master Key desciption";     
  CreateKeyRequest request = new CreateKeyRequest().withDescription(desc);
  CreateKeyResult result = kms.createKey(request);

3) CMK 암호화 복호화

  String keyId = result.getKeyMetadata().getArn().toString();

  ByteBuffer plaintext = ByteBuffer.wrap("demo text".getBytes("UTF-8"));

  EncryptRequest enRequest = new EncryptRequest().withKeyId(keyId).withPlaintext(plaintext);

  ByteBuffer ciphertext = kms.encrypt(enRequest).getCiphertextBlob();

  DecryptRequest deRequest = new DecryptRequest().withCiphertextBlob(ciphertext);
  ByteBuffer deResult = kms.decrypt(deRequest).getPlaintext();
  String data = new String(deResult.array());
  System.out.println("decrypt data : " + data);

1.Data Keys 1) IAM 유저 권한 설정

  • 위와 동일

2) Data Keys 생성 코드

  GenerateDataKeyRequest dataKeyRequest = new GenerateDataKeyRequest().withKeyId(keyId).withKeySpec("AES_256");
  GenerateDataKeyResult dataKeyResult = kms.generateDataKey(dataKeyRequest);

  // 평문 AES-256 암호화 키
  ByteBuffer plaintextKey = dataKeyResult.getPlaintext();

  // 암호화된 AES-256 암호화 키
  ByteBuffer encryptedKey = dataKeyResult.getCiphertextBlob();

3) Data Keys 사용 방법

  • 위에서 generateDataKey 함수를 통해 plaintextKey, encryptedKey 2가지를 가져올 수 있습니다.
  • 이 중 plaintextKey는 암호화에 사용 후 바로 폐기 해주셔야 합니다. (보안적인 권장사항)
  • 암호화된 데이터 저장 시 encryptedKey도 같이 저장(잃어버리면 복호화 불가능)하여야 합니다.
  • 이후 복호화 작업 시 encryptedKey를 불러와 kms.decrypt 함수를 실행하여 plaintextKey를 가져옵니다.
  • 가져온 plaintextkey를 가지고 저장한 데이터를 복호화 시켜서 사용할 수 있습니다.
Written on August 4, 2017