지금까지 올라온 각종 네트워크 이론 포스트들을 보면 공통적으로 등장했던 단어가 있습니다. 바로 키입니다. 이번 글에서는 포스트마다 빠지지 않고 등장했던 중요한 개념인 키에 대해서 조금 더 자세히 알아보겠습니다.
키 (key)
우리가 흔히 키라고 부르는 암호 키(Encryption Key)는 암/복호화 과정에 함께 사용되는 일련의 값을 의미합니다. 대개 사람이 직접 연산하기 어려울 정도로 대단히 큰 수이며, 키의 길이가 길어지면 길어질수록 암호 알고리즘의 보안 강도(안전성이 유지되는 기간) 또한 높아지게 됩니다.
세상에 다양한 암호 알고리즘이 있듯, 키 또한 어떤 암호 알고리즘에 사용되는지에 따라 다양한 종류의 암호 키가 존재합니다. 우리가 이전에 SSH 통신을 하기 위해 PuTTYGen을 통해 만들었던 키의 경우도 RSA 방식의 암호 키였던 것을 확인할 수 있습니다.
키의 경우 암/복호화에 직접적으로 사용되는 값이기 때문에, 몇몇 경우를 제외하고는 외부에 노출되어서는 안됩니다. 노출된 키 값에 의해 해당 키를 사용해 암호화가 진행된 암호문은 모두 복호화가 가능하기 때문에, 키는 평문과 같은 가치를 지닌다고 볼 수 있습니다.
키의 종류
암호 알고리즘에 따른 키의 특징을 살펴보겠습니다.
암호화 방식에 따른 분류
- 대칭 키(Symmetric Key)
대칭 암호는 같은 키를 이용하여 암호화와 복호화를 모두 수행한다는 특징을 갖고 있습니다. 따라서 송신자와 수신자는 암호화에 사용된 공통의 키를 보유하고 있어야하며, 이 키는 절대 노출되어서는 안됩니다. 대칭 암호의 경우 키가 외부에 공개되지 않은 상태에서만 기밀성을 보장할 수 있기 때문입니다.
- 공개 키(Public Key)
공개 키 암호는 암호화와 복호화에 다른 키를 사용합니다. 송신자가 수신자의 공개 키를 통해 평문을 암호문으로 바꾸고, 수신자는 본인의 개인 키를 통해 암호문에 대한 복호화를 진행합니다. 공개 키로는 암호화만 가능하고, 이를 이용해 암호문을 평문으로 변환할 수는 없기 때문에 수신자의 공개 키는 외부에 노출되어도 괜찮고 그래야만 하지만, 수신자의 개인 키는 대칭 암호 키와 마찬가지로 외부에 노출되어서는 안됩니다.
기능에 따른 분류
- 메시지 인증 코드(MAC, Message Authentication Code)
메시지 인증 코드는 수신받은 데이터가 송신한 상태로부터 변조되었는지 확인하기 위해 사용하는 방법입니다. 송신자가 메시지를 보내기 전, 수신자와 함께 공유하는 키를 이용해 MAC을 생성하고, 이를 메시지와 함께 수신자에게 전달합니다. 수신자는 받은 메시지와 공유한 키를 토대로 MAC를 생성하여, 메시지와 함께 전달받은 송신자의 MAC과 비교합니다. 이를 통해 수신자는 메시지가 중간에서 변조되었는지 여부를 확인할 수 있게 됩니다.
수신자와 송신자가 같은 키를 공유하여 사용하기 때문에, 처음에 설명했던 대칭 키를 사용하고 있는 형태라고 볼 수 있겠습니다.
- 디지털 서명(Digital Signature)
.
디지털 서명은 네트워크에서 송신자의 신원을 증명하기 위한 방법입니다. 메시지에 일방향 해시 함수를 적용하여 정해진 크기의 문자열로 만들고, 이를 송신자의 개인키를 사용하여 암호화를 진행합니다. 수신자는 송신자로부터 건네받은 메시지와 송신자의 공개 키를 토대로 해시 값을 구하고, 이를 전달받은 내용과 일치하는지 확인하여 검증합니다,
디지털 서명에 대한 자세한 내용은 해당 포스트를 참고해주세요.
디지털 서명의 부인방지(Non-requdiation)
보안 속성에 따른 분류
- 기밀성을 유지하기 위한 키
기밀성을 유지하기 위해 사용하는 키로, 대칭 암호나 공개 키 암호에서 사용하는 키가 여기에 해당합니다. 주로 평문 자체를 암호문으로 변경하는 알고리즘에 함께 사용됩니다.
- 인증을 수신하기 위한 키
송신자가 보낸게 확실한지, 메시지에 변조는 없었는지 등을 확인하기 위해 사용하는 키로, 메시지 인증 코드나 디지털 서명에서 사용하는 키를 포함하고 있습니다.
키 사용 횟수에 따른 분류
- 세션 키(session key)
하나의 통신 세션에서 한 번만 사용되는 키를 세션 키라고 부릅니다. 즉, 한 번의 통신에서 암호화와 복호화를 수행하고 곧바로 폐기되는 1회용 키입니다. 세션이란 기본적으로는 두 엔드 포인트(예시에서는 송신자와 수신자)가 한 번 통신을 주고받는 단위입니다. 경우에 따라서는 횟수가 아닌 일정한 기간으로 설정되기도 합니다.
- 마스터 키(master key)
마스터 키란 세션 키와 반대로, 한 번 쓰고 버려지는 키가 아닌 반복적으로 사용되는 키를 말합니다. 위의 세션 키에 대한 설명을 보고 세션 키가 대칭 암호라는 것을 유추하실 수 있을텐데, 주로 서버에서 세션 키를 양쪽 엔드 포인트에 분배할 때, 마스터 키를 통한 연결을 사용합니다.
암호화 대상에 따른 분류
- CEK (Contents Encrypt Key)
CEK는 컨텐츠를 암호화 하는 키를 의미합니다. 우리가 통신을 할때 상대에게 전달하는 주체가 되는 메시지, 이미지, 비디오 파일 같은 경우가 컨텐츠에 해당합니다. 주로 대칭 키가 많이 사용됩니다.
- KEK (Key Encrypt Key)
KEK는 키를 암호화 하는 키를 의미합니다. 네트워크 상에서 메시지가 아닌 키를 전달해야 할 경우가 있는데, 이때 전달하는 키를 암호화 할때 사용되는 키를 말합니다. 주로 공개 키 방식이 많이 사용됩니다. CEK와 KEK를 함께 사용하는 하이브리드 암호가 KEK를 사용하는 대표적인 예시입니다.
키 관리
통신에서 암호 키가 많은 부분을 차지하는만큼, 키를 관리하는 방법 또한 중요합니다. 각 단계별로 존재하는 문제점과 관리 포인트를 보면 아래와 같습니다.
키 생성
키 생성에는 크게 두 가지 방법이 있습니다.
- 난수를 이용하여 키를 생성하기
난수를 이용하여 키를 생성하게 되면 "키의 성질을 토대로 키를 추측하기 어려워야 한다"는 키 구성의 조건을 만족합니다. 소프트웨어로 생성하게 되면 주기(패턴)가 발생할 수 있으니, 하드웨어를 통해 진짜 난수(True Random Number)를 생성하는게 가장 좋습니다. 그러나 통상적으로는 충분한 복잡도를 갖췄다고 여겨지는 의사난수 생성기(PRNG: Pseudo Random Number Generator)를 이용합니다.
- 패스워드를 이용한 키 생성
패스워드나 패스프레이즈(passphrase)를 통해 키를 만드는 경우도 있습니다. 다만 이 경우에는 패스워드를 직접 키로 이용하면 안되고, 일방향 해시 함수를 통해 한 번 처리가 된 해시 값을 키로 이용합니다. 이렇게 만들어진 키를 통해 암호화를 적용하는 방법을 패스워드를 기초로 한 암호, PBE(Password Based Encryption) 라고 부릅니다.
물론 PBE의 경우도 단순히 패스워드를 해시 처리하는 선에서 끝내지는 않고, 해시 함수의 입력으로 패스워드와 함께 솔트(salt)라고 불리는 추가적인 입력을 더하여 넣습니다. 패스프레이즈가 단어들을 기반으로 만들어지는 문자열이다보니, 사전 공격에 당할 수 있는 위험이 있기 때문에 보안성을 위해 이렇게 솔트를 추가해준다고 하네요.
키 배송
- 키 배송 문제
대칭 암호를 이용한 통신의 경우 송신자와 수신자가 같은 키를 가지고 있어야 하는데, 이때 송신자와 수신자가 안전하게 키를 배송 받기 위해 발생하는 문제들입니다.
원활한 통신을 위해 키를 사전에 공유하거나, 키 배포 센터를 이용하거나, 대칭 암호를 사용하지 않던가(공개 키 암호를 이용하여 통신), Diffie-Hellman 키 교환 법 처럼 수학적인 방법을 사용하는 것이 해결 방안이 될 수 있겠습니다.
키 갱신
키를 주기적으로 갱신하면 보다 안전한 통신을 구축하는데 도움이 됩니다. 키가 노출되었을 경우, 공격자가 해당 키를 이용해 일정 기간 이전의 통신 내역을 복호화 시키는 것을 막을 수 있습니다. 이렇게 현재의 보안 요구 사항을 충족하면서도 이전에 발생한 보안 위협에 대해서 안전성을 유지하는 개념을 백워드 시큐리티(Backward Security) 라고 합니다.
가장 간단하게 공통 키를 사용하는 통신에서 키를 갱신하는 방법으로는 현재 키를 다음 키의 해시 값으로 사용하는 방법 등이 있습니다.
키 보존
키를 반복해서 사용하려면 키 보존 문제를 고려해야합니다. 보통의 키는 아무리 짧더라도 사람이 기억하기에는 불가능한 경우가 대부분이기에 어딘가 안전한 곳에 보관해야합니다.
다만 키를 암호문과 같은 컴퓨터에 보관하는 것은 권장되지 않는 방법입니다. 파일 형태로 보존된 키를 물리적으로 분리된 안전한 장소에 보관하도록 하고, 이를 암호화해서 보존하는 기술을 사용해야합니다.
키 폐기
사용되지 않는 키는 반드시 폐기해야 합니다. 가령 키 갱신을 통해 이제 사용하지 않게 된 이전의 키가 남아있다면, 외부의 공격이나 실수로 노출되었을때 해당 키를 가진 사람은 이전의 암호문들을 마음대로 복호화 할 수 있게 됩니다.
물론 당장 사용되지 않는 키라고 해서 아무 대책 없이 삭제해서는 안되고, 삭제한 키를 복구할 가능성까지 고려하여 신중하게 삭제를 진행해야 합니다. 이 과정을 통틀어서 키 폐기 작업이라고 합니다.
마치며
이번 포스팅에서는 키에 관련하여 알아보았습니다. 그동안 등장했던 개념도 있고, 이번에 처음 소개된 개념들도 있는데 이번 글로 머리속에 키와 암호화에 대한 내용들을 체계적으로 정리할 수 있는 기회가 되었으면 좋겠습니다.
다음 글에서는 위에서 잠깐 소개되었던 난수(Random Number)에 대해 알아보겠습니다.
읽어주셔서 감사합니다.
'이론 > 네트워크' 카테고리의 다른 글
인터넷 프로토콜 HTTP와 HTTPS (0) | 2023.09.03 |
---|---|
공개 키 인증서 (Public key certificate) (0) | 2023.05.28 |
디지털 서명의 부인방지(Non-repudiation) (0) | 2023.05.14 |
파일의 무결성 검증하기 (일방향 해시 함수) (0) | 2023.04.30 |
RSA 알아보기 (2) | 2023.04.08 |
댓글