9.통신 메시지 암호화하기

ProudNet은 성능과 보안 수준에 따라 다양한 암호화 기능을 제공합니다. ProudNet에서 암호화된 메시지를 전송하려면 RMI 메서드 호출 혹은 SendUserMessage 계열 메서드에 들어가는 인자 중 Proud.RmiContext.m_encryptMode에 원하는 암호화 방식을 선택하시면 됩니다.

예시

RmiContext rmiContext;
rmiContext.m_encryptMode = EM_Secure;
Proxy.RequestLogon(HostID_Server, rmiContext, m_Name, password);
RmiContext rmiContext;
rmiContext.m_encryptMode = EM_Fast;
Proxy.RequestLogon(HostID_Server, rmiContext, m_Name, password);

이렇게 쉽게 할 수도 있습니다.

Proxy.RequestLogon(HostID_Server,RmiContext::SecureReliableSend, m_Name, password); // EM_Secure 를 사용
Proxy.RequestLogon(HostID_Server,RmiContext::FastEncryptedReliableSend, m_Name, password); // EM_Fast 를 사용

P2P Group에서 암호화 기능을 사용할 경우 CStartServerParameterBase::m_enableP2PEncryptedMessaging 의 값을 true로 설정 해야 합니다.

9.1ProudNet의 암호화 기법

프라우드넷은 강력한 보안 통신 기능을 제공하고 있습니다. 가령, 로그인 관련 메시지를 높은 암호화를 수행하게 합니다.

먼저, 암호화라는 것이 무엇인지 알아봅시다.

어떤 메시지가 다른 컴퓨터로 전달될 때 제3자가 내용을 해독하거나 변조할 수 있으면 해킹을 당하기 쉽습니다. 예를 들어 입력한 아이디,비밀번호가 제3자에 의해 해독/변조가 될 수 있으면, 어느날 게임에 접속했더니 자기 캐릭터가 알몸이 되어 있겠죠.

그래서 메시지를 암호화하려면 암호화,해독(복호화)를 하는 알고리즘(공식)이 각각 있어야 합니다. 하지만 알고리즘이 공개되면 위험할 수 있겠죠? 그래서 뻔히 아는 알고리즘이 눈 앞에 있어도 암호화된 메시지를 풀지 못하게 하는 수단, 즉 열쇠(키)가 있어야 합니다. 현대 전산학에서 암호화 알고리즘은 키 기반 암호화가 통용되고 있습니다. 암호키의 길이는 1비트에서 수백 비트까지 다양합니다.

해커가 암호화된 메시지를 캐내서 얻어냈다고 가정하겠습니다. 해커가 그 메시지의 내용을 알아내려면 메시지를 해독할 키를 알아야 합니다. 이미 알고리즘은 얻었다고 가정합시다. 어떤 키를 넣어봐야 할지 시도해볼 것입니다. 만약 암호키의 길이가 128비트라고 가정합시다. 그럼 2^128 개의 암호키 중 하나가 맞을 것입니다. 암호키를 일일히 대보는 해커가 만들었다고 가정합시다. 암호키 하나 대보는데 1/1,000,000,000,000초(이정도면 몇백억원짜리 수퍼컴퓨터 급입니다)가 걸린다고 가정하고요. 암호키를 찾는데 겨우 10,790,283,070,806,014,188년밖에 안걸립니다.

키, 즉 암호키는 크게 비대칭키와 대칭키로 구별됩니다. 비대칭키는 한 쌍의 열쇠가 있어서, 한 개의 열쇠로 암호화하면 나머지 한 개의 열쇠가 없으면 해독할 수 없습니다. 대칭키는 암호화할 때 쓴 키와 해독할 수 있는 키가 서로 같음을 의미합니다. 이러한 성질을 활용해서, 컴퓨터 네트워크에서는 암호화된 메시지를 전송하기 위해 대칭키와 비대칭키를 혼용하기도 합니다.

두 호스트 A,B가 있다고 가정하죠. A가 B에게 안전하게 암호화된 메시지를 전달하고자 합니다. A는 먼저 비대칭키 한쌍을 만듭니다. 그리고 하나는 자기가 갖고 있고 나머지를 B에게 전송합니다. 자기가 갖고 있는 것을 개인키(Private Key), B에게 전송한 키를 공개키(Public Key)라고 부릅니다.

이때 해커는 가뿐하게 공개키를 얻어버렸다고 가정하겠습니다.

B는 대칭키(Session Key)를 만들고 갖고 있습니다. A로부터 공개키가 도착했습니다. 이제 그것을 갖고 있는 대칭키로 암호화합니다. 그리고 암호화한 대칭키를 A에게 보내줍니다. 해커는 역시 그것도 얻어버렸습니다.

A는 받은 대칭키를 개인키로 복호화합니다. 그리고 B가 만든 대칭키를 공유합니다. 해커는 공개키와 암호화된 대칭키를 갖고 있지만 정작 개인키가 없어서 대칭키 내용을 알 수 없습니다.

이제 A는 암호화할 메시지 본문을 B로부터 받은 대칭키로 암호화 후 B에게 전송합니다. 해커는 이것도 갈무리했습니다.

B는 암호화된 본문을 가지고 있는 대칭키로 복호화해서 잘 씁니다. 한편, 해커는 아직도 대칭키를 얻지 못했기 때문에 해킹해서 갈무리한 메시지를 얻어내지 못합니다.

에라 모르겠다, 해커는 B에게 메시지 내용을 이것저것 훼손해서 보내봅니다. B는 받아서 복호화해봤더니 복호화가 되지 않습니다. 뭐, 그냥 버립니다.

프라우드넷은 이러한 암호화 방식을 내장하고 있습니다. 비대칭키 알고리즘을 128bit RSA를, 대칭키 알고리즘으로 AES 와 Fast를 쓰고 있습니다. RSA는 매우 강력합니다. 하지만 계산량이 막대해서 모든 메시지를 암호화하기에는 벅찹니다. 그래서 대칭키 알고리즘과 혼용합니다.

프라우드넷은 클라이언트와 서버간 통신 뿐만 아니라 P2P로 통신할 때도 지금까지 설명한 방식의 암호화 기능을 제공합니다. P2P간 통신도 제3자가 해독/변조하지 못하게요.

9.2암호화 메시징의 성능

ProudNet의 RMI 단위별로의 암호화 방식은 AES 방식 또는 Fast 방식을 사용합니다. 성능 측정 결과, 요새 서버 컴퓨터에서는 초당 10만회 정도의 암호화된 RMI 를 주고 받을 수 있는 것으로 추정됩니다.

암호화된 RMI에서 사용되는 대칭키는 초기 서버 연결시 RSA 알고리즘 공개키로 암호화되어 교환됩니다. 따라서 암호화된 RMI의 보안 신뢰성은 매우 높습니다.

9.3암호화 메시징의 주의사항

ProudNet 클라이언트가 서버로 연결하는 과정에서 발생하는 이벤트 Proud::INetServerEvent::OnConnectionRequest에서 받거나 보내는 커스텀 필드는 암호화가 되어있지 않습니다. 이것을 통해 사용자 정보를 주고받으면 안됩니다!

9.4암호화 키 길이: 암호화 수준과 성능 사이에서 조율하기

ProudNet의 암호화 과정에서 ProudNet 내부에서는 호스트간 키 교환이 이루어집니다. 이때 주고받는 키의 길이를 사용자가 설정할 수 있습니다. 암호화 키의 길이는 시스템의 성능과 암호화 수준을 고려하여 설정해야 합니다.

암호화 키의 길이는 서버 시작시의 파라메터 Proud.CStartServerParameter.m_encryptedMessageKeyLengthProud.CStartServerParameter.m_fastEncryptedMessageKeyLength 에서 설정할 수 있습니다.

Proud.CStartServerParameter.m_encryptedMessageKeyLength 파라메터는 AES방식의 암호화를 사용할때 키의 길이를 뜻하며, Proud.EncryptLevel.EncryptLevel_Low , Proud.EncryptLevel.EncryptLevel_Middle , Proud.EncryptLevel.EncryptLevel_High 의 세가지 키 길이를 세팅할 수 있습니다.

Proud.CStartServerParameter.m_fastEncryptedMessageKeyLength 파라메터는 Fast방식의 암호화를 사용할때의 키의 길이를 뜻하며, Proud.FastEncryptLevel.FastEncryptLevel_Low , Proud.FastEncryptLevel.FastEncryptLevel_Middle , Proud.FastEncryptLevel.FastEncryptLevel_High 의 세가지 키 길이를 세팅할 수 있습니다.

AES 암호화 방식은 Fast보다 다소 느리지만 보다 수준 높은 암호화를 제공합니다. 그러나 캐릭터의 이동메시지 같은 중요하지 않은 데이터나 많은 송수신이 이루어지는 메시지의 경우에는 빠른 성능을 가지고 있는 Fast를 사용하실 수 있습니다.

다음은 ProudNet 의 Fast AES 알고리즘의 성능을 비교한 것입니다.

각 알고리즘을 사용해 암복호화 각 1회를 1번으로 10만번 수행하였을 때의 시간을 측정한 것입니다.

그림 9-1ProudNet Fast AES 알고리즘의 성능비교

암복호화에 대한 수행 시간은 PC 의 사양과 데이터의 크기에 따라 차이가 있을 수 있습니다.

테스트를 진행한 컴퓨터의 사양은 다음과 같습니다.

OS

Windows 7 Professional K

CPU

Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 3.40GHz

RAM

16.0GB

System type

64-bit Operating System