티스토리 뷰
# 작업순서
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 암복호화 방법에 대한 설명을 나보다 더 간단하게 그리고 빠르게 설명한 블로그는 없을 것이다. 적어도 이 글을 쓴 시점을 기준으로는...
'Spring Framework' 카테고리의 다른 글
RedissonClient 를 사용하여 redis 서버에 값 넣고 빼기 (0) | 2018.10.10 |
---|---|
the following connectors are not available gradle (sts legacy) support (0) | 2018.08.14 |
이클립스 SVN 커밋 시 target 등 불필요한 부분 안 나오게 하기 (1) | 2018.07.20 |
There are no difference from selected input (0) | 2018.06.26 |
Tiles, Sitemesh, Freemarker, JSP, thymeleaf 에 대한 짧은 기록 (0) | 2018.05.14 |
- Total
- Today
- Yesterday
- 자바 정규식
- 아파치 톰캣 연동
- 휴대폰번호 마스킹
- commit
- 오라클
- 마스킹
- AES 복호화
- redissonclient
- Eclipse
- AES 암호화
- svn
- 스프링
- AES Decryption
- 클래스로더
- Java
- apache
- 이클립스
- STS
- 톰캣
- Tomcat
- redisson
- 아파치
- RegExp
- spring
- jvm특징
- SSL
- AES with AWS KMS
- AWS KMS
- Oracle
- AES Encryption
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |