봉투 암호화 (envelope encryption)
봉투 암호화 (envelope encryption)는 보안적으로 중요한 값을 숨길 때 사용하는 암호화 기법 중 하나다.
편의성과 안정성, 성능을 균일하게 가져가기 위한 하이브리드 방법론이라고 보면 된다.
배경
어떤 값을 안전하게 보관해야 한다면, 암호화를 해서 저장하는 것이 당연한 접근법이 될 것이다.
근데 이 암호화에는 크게 2가지의 방법이 있다.
공개키/비밀키를 쓰는 비대칭키 방식과 단일 키를 사용하는 대칭키 방식이다.
각 방법의 특징과 장단점은 다음과 같다.
비대칭키
비대칭키 방식은 보안 리스크 관점에서 키 관리가 용이한 편이다.
읽기가 더 많은 경우에는 읽기 시스템에만 공개키를 두고 쓰기 시스템에만 비밀키를 격리해서, 보안 리스크를 줄이고 위험한 지점에 더 집중해서 관리할 수 있기 때문이다.
하지만 비대칭키 방식은 성능이 떨어진다는 단점이 있다. 복호화/암호화에 있어서 처리량이 상당히 낮고, 규모가 커질수록 성능 병목이 될 수 있다.
게다가 평문 길이에도 제한이 존재한다. 큰 값을 넣을 수 없다.
대칭키
반면 대칭키 방식은 보안적으로는 좀 불안할 수도 있다. 암호화와 복호화에 위험한 단일 키를 넣어둬야 하기 때문에 키 유출과 관련된 보안 리스크가 커지기 때문이다.
하지만 성능적으로는 훨씬 빠르다는 장점이 있다. CPU 수준에서 최적화가 잘 되는 가벼운 알고리즘들을 쓰기 때문이다.
게다가 비대칭키에 비하면 꽤 큰 값을 넣을 수 있다.
그래서 이런 장단점들을 결합하기 위한 하이브리드 방법론들이 나오기 시작했는데, 그 중 대표적인 것이 봉투 암호화다.
봉투 암호화 (envelope encryption)
봉투 암호화는 암호화 키를 이중화하는 방식을 취한다. 총 2개의 키가 존재한다.
다음과 같은 흐름으로 진행된다.
만약 데이터를 새로 생성한다면, 데이터 키를 하나 만들고 데이터 키를 써서 원본 데이터를 암호화한다.

여기서 끝이 아니다.
마스터 키라는 별도의 키를 만들어서 방금 만든 데이터 키를 또 암호화한다.

그러고 나면 다음과 같이 최종적으로 저장되는 것은 마스터 키와 암호화된 데이터 키, 암호화된 데이터가 남는다.
이런 식으로 배치가 된다. 저 암호화된 데이터 쌍을 하나의 봉투라고 부르며, 함께 저장된다.
이후에 데이터를 다시 읽어야 한다면, 마스터 키를 가져다가 데이터 키를 복호화한다.
그리고 데이터 키로 암호화된 데이터를 복호화해서 원본 값을 가져올 수 있는 것이다.
보통 여기서 마스터 키는 비대칭키를, 데이터 키에는 대칭키를 사용한다.
마스터키는 비대칭/대칭키를 전부 사용해도 상관없으나, 데이터 키는 반드시 대칭키를 사용해야 정상적인 성능을 기대할 수 있다.
장단점
그럼 이걸로 인해서 뭘 얻을 수 있을까?
일단 보안 수준을 격리할 수 있다. 만약 시크릿 데이터 저장소가 공격을 당해 데이터가 유촐되더라도, 마스터 키가 없으면 아무것도 읽을 수 없는 것이다.
마스터 키를 바꾸는 것도 비교적 가볍다.
마스터 키를 바꾸는 것을 회전(rotation)이라고 부르는데, 전체 데이터의 재암호화를 하는 것이 아니라 비교적 작은 데이터 키만 재암호화하면 되기 때문이다.
단점도 당연히 있다.
이 말인즉슨 마스터 키가 가장 중요한 보안 취약점이 된다는 것이다. 털리지 않게 모든 공을 쏟아야 하고, 이것까지 털리면 모든게 망하는 것이다.
사용례
AWS의 KMS는 봉투 암호화를 적용한 대표적인 보안 시스템 중 하나다. 이를 통해 강력한 보안 수준을 제공한다.
이외에 비슷한 경쟁사 서비스인 Google Cloud KMS, Azure Key Vault 등도 이 방법론을 사용한다.
참조
https://tech.kakaopay.com/post/kakaopayins-envelope-encryption/
https://stackoverflow.com/questions/69709738/what-is-the-benefit-of-envelope-encryption