티스토리 뷰

# 작업순서

1. AWS KMS 생성

2. AWS Crypto 추가

3. 코드 개발




1. AWS KMS 생성

  - AWS 에 로그인 후 리소스 -> IAM 으로 이동

  - 좌측 메뉴 하단에 "암호화 키" 선택 (메뉴명은 언어에 따라 다릅니다. 전 한국어 메뉴라서....영어일 경우 당연히 영어로 나오겠죠?)


  - 리전 선택

  - 키 생성

 

  - 별칭 생성 및 설명 생성에서 고급옵션을 누른 후 KMS 선택 필수

  - 이후 태그는 추가하지 않아도 상관 없음

  - 키 관리 권한 정의에서는 해당 키를 관리할 사용자 또는 역할 그룹 선택 (관리라 함은 키 생성 및 폐기 등)

  - 키 사용 권한 정의에서는 해당 키를 사용할 사용자 또는 역할 그룹 선택

  - 미리보기는 말 그대로 미리보기일 뿐 ㅎㅎㅎ




2. AWS Crypto 추가

  - pom.xml 에 dependency 추가한다.

 <!-- AWS -->

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.106</version>
</dependency>
<!-- AWS Encryption SDK for Java -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-encryption-sdk-java</artifactId>
<version>1.3.1</version>
</dependency>

  - AWS Java SDK 와 AWS Crypto SDK 두 가지를 추가했다.




3.  코드 개발

  - 구글링을 해보면 제대로 나온 것이 없다. 그리고 AWS 에서 제공하는 개발 가이드 또한 헷갈리고 최신화가 되어있지 않은 부분이 많다. 나도 그래서 엄청 헷갈려했고 삽질을 많이 했었다.

  - 그 결과 아래와 같이 간단하게 하면 된다는 것을 알아냈다.


@RestController
@RequestMapping("/crypto/AES")
public class AwsKmsAES {

private String awsKmsArn = "arn:aws:kms:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

// Instantiate the SDK
private AwsCrypto crypto = new AwsCrypto();

// Set up the KmsMasterKeyProvider backed by the default credentials
private KmsMasterKeyProvider prov = null;

private static final Logger logger = LoggerFactory.getLogger(AwsKmsAES.class);

@PostMapping("/Encrypt")
public String EncryptAES256(@RequestParam("value = text") String plainText) throws UnsupportedEncodingException {
logger.info("Params : plainText = {}", plainText);

prov = new KmsMasterKeyProvider(awsKmsArn);

crypto.setEncryptionAlgorithm(CryptoAlgorithm.ALG_AES_256_GCM_IV12_TAG16_HKDF_SHA256);

// Encrypt the data
String ciphertext = crypto.encryptString(prov, new String(plainText.getBytes("UTF-8"))).getResult();

logger.info("AES256 Encryption Result : {}", ciphertext);

return ciphertext;
}

@PostMapping("/Decrypt")
public String DecryptAES256(@RequestParam("value = text") String ciphertext) throws UnsupportedEncodingException {
logger.info("Params : ciphertext = {}", ciphertext);

prov = new KmsMasterKeyProvider(awsKmsArn);

crypto.setEncryptionAlgorithm(CryptoAlgorithm.ALG_AES_256_GCM_IV12_TAG16_HKDF_SHA256);

// Decrypt the data
String decryptText = crypto.decryptString(prov, ciphertext).getResult();
decryptText = new String(decryptText.getBytes("UTF-8"));

logger.info("AES256 Decryption Result : {}", decryptText);

return decryptText;
}
}

  - 여기서 중요한 것은 "awsKmsArn"이라는 변수에 들어갈 값인데 이 값은 1번에서 생성한 곳에서 가져오면 된다.

  - 리소스 -> IAM -> 암호화 키 -> 리전 선택 -> 1에서 생성했던 KMS 키(별칭) 선택 한 후 ARN 값을 가져오면 된다.



위 코드대로만 하면 암호화 된 값을 가져오거나 복호화 할 수 있다. 


참고로  

setEncryptionAlgorithm(CryptoAlgorithm.ALG_AES_256_GCM_IV12_TAG16_HKDF_SHA256)

부분에 나와있는 것을 잠시 언급하자면...위에 설정한 AES With SHA256은 AES256 암호화 한 값에 해시값을 붙인 것이다.


따라서 암호화 할 때마다 나오는 값이 바뀐다.


참고로 AWS 에서 가장 추천하는 알고리즘은 ALG_AES_256_GCM_IV12_TAG16_HKDF_SHA384_ECDSA_P384  이다.



마지막으로 참고할 만한 사항은....


AWS KMS에 생성된 키 값은 절대로 AWS KMS 외부로 가지고 나올 수 없다. 이 말은 내 눈으로 키 값을 어떤 방법으로도 빼내서 확인할 수 없다는 뜻이다.


키 값은 BLOB 형태로는 가져올 수 있는데 식별 가능한 텍스트 형태로는 변경할 수 없다.



또한...이렇게 사용해보니 암복호화 하는데 시간이 오래 걸린다. 이 말인 즉, 빠른 처리속도가 중요한 서비스에서는 필요할 때마다 쓸 수 없다는 말이다. 





AWS KMS를 사용한 AES 암복호화 방법에 대한 설명을 나보다 더 간단하게 그리고 빠르게 설명한 블로그는 없을 것이다. 적어도 이 글을 쓴 시점을 기준으로는...

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함