본문 바로가기
쿤즈 Secure/암호이야기

암호화 만큼 중요한 암호키 관리는 어떻게 할까?

by :)Koon 2020. 8. 5.

이제는 네트워크 상에서 가장 중요한 요소중 하나는 암호화가 아닐까 생각됩니다. 내가 누구가에게 보내는 데이터가 원문 그대로 날아간다면 큰 문제가 될 것입니다. 누군가는 내 정보를 볼 수도 있고 누군가는 내가 보낸 메세지를 바꿔서 보내는 경우가 발생 할 수도 있습니다. 그래서 암호화가 굉장히 중요합니다.

 

이번 포스팅에서는 암호화뿐만 아니라 암호화 할 때 사용하는 키는 어떻게 관리할 수 있는지 알아보겠습니다.


암호화는 무엇인가요? (feat. 복호화까지)

암호화는 말 그대로 우리가 알아볼 수 있는 메세지(단어, 문장, 혹은 그 이상의 긴 데이터)를 알아 볼수 없는 값으로 만드는 과정을 의미합니다.

 

 

이해하기 쉽게 암호문제 풀어보기 같은거 해보신적 있으신가요? 예를들어 보겠습니다.

 

암호문: Crrng

 

위와 같은 암호문 단어가 있을때, 이 단어를 알기 위해서 우리는 규칙을 먼저 찾습니다. 그리고 이 단어는 원문에 알파벳 2개씩 뒤에 있는 문자를 넣은 것이라 판단하고 원문을 알아냅니다.

 

원문 : Apple

 

과거 암호는 이렇게 시작되었습니다. 현대에는 이 규칙이라는 것을 알고리즘 이라는 단어를 사용하고 원문에서 암호문으로 바꾸는 과정을 암호화, 암호문을 다시 원문으로 바꾸는 과정을 복호화 라고 합니다.


알고리즘을 알면 암호문을 풀 수 있겠네요?

개인적인 의견으로는 불가능에 가깝습니다. 위와같은 간단만 문제들이라면 알고리즘을 알면 푸는것이 가능하겠지만, 간단하게 계산해서 알아내는 문제들로 암호문을 만들지는 않습니다.

 

현대 암호에서는 암호화를 할때 제 3자가 알지 못하는 "암호키"를 이용해서 암호화를 합니다. 그래서 알고리즘을 안다고 해도 암호문을 복호화해서 원문을 알아내기 쉽지 않습니다. 게다가 알고리즘은 모두에게 오픈되어 있습니다. 그리고 누구나 알고리즘대로 프로그래밍을 하면 암호화와 복호화를 값을 만들 수 있습니다.

 

그래서 가장 중요한 부분중 하나는 바로 암호키를 어떻게 관리하는가 입니다. 암호키가 노출되면 둘 사이에서 주고받던 모든 암호문을 복호화하여 원문으로 볼 수 있기 때문입니다.

 

현대 사회에서는 알고리즘도 중요하지만 암호키 관리가 더 중요하게 생각하고 있습니다.


암호키는 어떻게 만들고 공유하나요?

암호키는 보통 일정한 길이의 값을 랜덤으로 생성합니다. 예를들어서 두 사람이 통신을 하려고 준비하고 있습니다. 그리고 원문을 그대로 전달할수 없으니 암호화를 하기로 합니다. 그럼 두 사람은 동일한 암호키를 사전에 공유하고 있어야 합니다. 이렇게 공유한 암호키를 이용해서 암호문을 전달하고 받는쪽에선 복호화를 하여 서로 내용을 전달하고 받습니다.

 

암호키는 랜덤으로 생성한다고 했습니다. 이때의 랜덤으로 만드는 값은 규칙이 없어야 하며 항상 다른값이 나와야 하고 유추가 불가능한 값입니다. 

 

 

이렇게 공유한 암호키를 계속 사용해도 될까요? 알고리즘이 동일하고 암호키가 동일하다면 동일한 문장에서 암호문도 동일하게 나오게 됩니다. 즉, 암호키와 알고리즘(규칙)이 동일한 상황에서 같은 내용을 두번 보내면 암호문도 동일한 암호문이 두번 전송됩니다. 그래서 암호키를 주기적으로 변경하는 방법도 있습니다.

 

하지만 암호키를 매번 사전에 만나서 공유받고 하면서 통신을 할 수 없죠. 그래서 소프트웨어적으로 암호문을 전달하기 전 암호키를 공유하는 작업을 합니다. 우리가 브라우저를 보면 상단에 "자물쇠" 모양이 하나 뜰텐데요, HTTPS 가 붙은 사이트에서만 이 자물쇠 모양이 보이며 이는 위에서 설명한듯 암호키를 먼저 공유하고 그 이후에 메세지를 보내고 받게 하는 사이트라는 뜻입니다. 없는사이트보다 안전하다고 볼 수 있습니다.

 

이때 우리가 사용하는 암호키는 대칭키(Symmetric Key) 라 하고 공유할때 사용하는 키는 공개키(Public Key) 라 불립니다. 이 부분은 별도의 포스팅으로 알아볼 예정입니다.


암호키의 저장은 어디에?

중요한건 암호키라고 말씀드렸습니다. 그렇다면 암호키는 어떻게 저장해야 할까요? 메모리에 저장을 해도 되고 DB 에 저장을 해도 되고 파일에 저장해도 되고 KMS(키 관리 서버) 에 저장해도 됩니다.

 

메모리에 저장하는 방법은 위에서 본 HTTPS 와 같이 실시간으로 전송하고 끝나면 암호키를 지워버리는 방법입니다. 따라서 매번 새로운 암호키가 생성되고 지워지기를 반복하니 실시간 전송에서는 가장 좋은 방법이 아닐까 생각됩니다.

 

 

나머지 방법은 실시간이 아닌 경우입니다.

 

파일에 저장하는 경우 누구나 볼 수 있기 때문에 키도 암호화 해야 합니다. 그럼 이 키를 암호화 하는 또 새로운 키가 필요합니다. 그리고 그 키 역시 또 다른 키로 암호화하고, 이 키를 또 암호화 하기 위해 또다른.....이러면 솔직히 끝도 없을것 같네요. 물론 두번째 하드웨어의 특정 값으로 암호화 할 수도 있을것 같습니다. 하지만 암호키가 동일한 위험이 있을것 같네요.

 

DB 저장하는 경우 DB 암호화를 해서 저장할 수 있습니다. DB 암호화는 여러 솔루션들도 많이 있네요. 이 역시 키를 암호화해서 저장하고 암호화하는 키가 존재하게 됩니다. 파일에 저장하는 방법과 마찬가지네요. 생각해보면 DB 역시 파일입니다. 하지만 파일보다도 훨씬 더 복작한 시스템입니다. 따라서 안정성도 뛰어나긴 합니다.

 

KMS(키 관리 서버) 에 저장하는 방법도 있습니다. PKCS#11 이라는 표준에 의해서 만들어진 이 모듈에는 사실 HSM (Hardware Security Module) 이라는 하드웨어 장치가 들어가 있습니다. 이 장치에 모든 키들을 저장하는 방법입니다. HSM 의 특성상 내부에 있는 키들은 외부로 나올 수 없습니다. 이 모듈에서 키가 내부에 있기 때문에 암호를 원할경우 원문을 넣어주면 암호문이 나오고, 암호문을 넣으면 복호화된 원문이 나오게 됩니다.

 

이렇게 메모리, 파일, DB, KMS(내에 HSM) 등 여러가지 방법을 통해서 암호키를 노출하지 않도록 관리하는 것이 중요한 부분입니다.


오늘 포스팅은 암호화와 암호키에 관련된 내용을 다뤄봤습니다. 암호라는 내용 자체가 보이지 않고 뭔가 막연한 느낌이 들기 마련입니다. 저 역시도 그렇습니다. 깊이있게 다뤄다보면 한도 끝도 없이 나락으로 내려가는게 또 암호인것 같네요. 쉬운 부분부터 차근차근 정리하면서 저도 깊이 내려가볼 예정입니다.

댓글