온라인 게임에서 통신 암호화

by nettadmin / 2010. 05. 05. [11:14]

온라인 게임 개발에서 로그인 과정은 만들기가 까다롭고 짜증나는 부분 중 하나입니다. 로그온 과정까지 만들기 위해 넘어야 할 산들은 많습니다. 오죽하면게임 서버 개발에서 로그인 과정까지 완성되면 서버 개발의 반은 끝났다고 하겠습니까?

완성되고 나서도 로그온 부분에서 말썽을 일으키기 십상입니다. 로그인 과정 중 오류, 데이터베이스 랙, 그리고 서비스 오픈하면 한차례 겪는 해킹, 아이템 복제 등 후폭풍이 기다립니다.

 

프라우드넷(ProudNet)은 로그인 과정을 쉽고 안전하게 만들 수 있는 여러가지 장치들을 제공합니다. 그중 보안 부분에 대해서 소개합니다.

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

 

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

 

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

 

해커가 암호화된 메시지를 캐내서 얻어냈다고 가정하겠습니다. 해커가 그 메시지의 내용을 알아내려면 메시지를 해독할 키를 알아야 합니다. 이미 알고리즘은 얻었다고 가정합시다. 어떤 키를 넣어봐야 할지 시도해볼 것입니다. 암호키를 일일히 대보는 해커가 만들었다고 가정해도 어마어마한 시간이 소요됩니다. 

 

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

 

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

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

 

 

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

  

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

 

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

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

 

 

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

 

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

프라우드넷의 이러한 기능을 쓰기 위해서 사용자(게임 프로그래머)는 딱 하나만 하면 됩니다. 프라우드넷에서 메시지 형식을 정의할 때 “이건 암호화할거임~”만 한마디 적어주면 끝입니다. 위 키 주고받기 과정은 사용자는 신경쓰지 않아도 됩니다. 

 

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

 

여기서 잠깐! 프라우드넷이 어떻게 암호화를 하는지 대놓고 공개해도 괜찮냐고요? 암호화 기법은 알고리즘을 공개해도 뚫지 못하는 데 그 가치가 있습니다. 이렇게 대놓고 공개해도 안뚫리니까 공개하는거죠. ^^;;;

 

프라우드넷이 제공하는 기능은 많습니다. 암호화 기능은 작은 부분에 불과합니다. 하지만 지금까지 홍보가 부족했던 것 같습니다.

 

 

 

Development Issues

Comments (5) -

skyilover
skyiloverKorea
5/6/2010 5:52:00 AM #

안녕하세요~

RSS를 구독해 눈팅만 하다가 떡밥[?]에 낚여 댓글을 달게되었습니다 ^^

반년전쯤에 본문과 같은 이슈를 해결할 일이 있어서 고민하던게 생각났답니다.

위와같이 구현을 하면 통신상에 데이터를 조작하려는 해커의 위치에서는 아무것도 못한다는 것을 이해했지만

만약 클라이언트 자체가 해킹을 당했다고 한다면 저런 것은 무의미 하더군요;

가령 Encrypt하는 함수와 Decrypt를 하는 함수를 알아 내버린다면 저 중간 과정을 무시하고 바로 암호화가 풀린 데이터 buf를 가져올 수 있었기 때문이였죠..

물론 패킷 조작하는 것이 매우 쉽기때문에 저것 만으로도 충분히 대부분의 해킹은 막을수 있다는 판단하에 그대로 적용 시켰습니다만

결국엔 Themida같은 것으로 프로텍팅 걸고 지속적으로 Themida에 key를 바꿔서 업데이트하면 Themida하고만 놀다 암호화가 풀린 데이터는 얻을 수 없을 것이다.로 마무리를 지었답니다.

혹시 프라우드넷엔 클라이언트 해체 이슈에 대해서도 안전한 것 인가요?

사용하신 RC4는 Replay Attack에 대해서 안전한지도 궁금하군요.

좋은하루되세요 ^^

하얀바다
하얀바다Korea
5/6/2010 12:39:00 PM #

└프라우드넷은 아직 클라이언트 자체를 보호하는 기능은 없습니다.
replay attack은 RC4에서 해결해주는 영역이 아닙니다. 프라우드넷은 RC4와 별개로, 메시지를 꽈서 replay attack를 차단하고 있어요.

액터1
액터1Korea
5/8/2010 3:36:00 AM #

안녕하세요?
온라인 게임 통신 암호화에 대한 글 잘 봤습니다.

저는 상용화 게임을 서비스한 적이 있는데, 실무와는 약간 동 떨어진 내용이 있어서 덧붙이고자 합니다.

이 포스팅에서   추구하는 통신보안은 제3자가 패킷을 가로챘을 경우의 보안에 해당하는 것입니다. 그렇지만 실제적으로 해커들이 게임을 해킹하는 방법은 위 skyilover님의 말씀처럼 클라이언트를 해킹하여 암호푸는 모듈을 통째로 가져다 씁니다.

즉, 3번째 그림에서 해커는 해독을 못하겠지만 클라이언트 B는 해독이 가능하잖아요. 해커는 클라이언트 B를 가지고 암호푸는 모듈을 만듭니다.

이 포스팅에서 나온 방법으로 온라인게임 통신 보안이 된다면 와우나 리니지 등에서 적용 못할리 없겠지요.

온라인 게임의 통신보안은 다른 시각으로 접근해야 합니다.

엘키
엘키Korea
5/11/2010 1:44:00 PM #

└네 말씀하신대로, 클라이언트 리버싱에 약한 것은 당연한 것이고....

아마도 프라우드넷이 패킷 분석을 통해 암호화를 뚫을 수 없다는 것을 말씀하시려는거 같은 느낌인데,

-> 암호화 기법은 알고리즘을 공개해도 뚫지 못하는 데 그 가치가 있습니다. 이렇게 대놓고 공개해도 안뚫리니까 공개하는거죠. ^^;;;

요 문장으로 오해를 사는거 같네요. ㅎㅎ 저도 오해했으니까요.

클라이언트 리버싱에는 대책 없다는 것을 imays님이 설마 그걸 모르실리 없을거 같고....

imays님이 좀 더 명확하게 글을 써주셔야 되는게 아닌가 싶네요. 리버싱에는 취약하다는 점을요.

온라인 게임 개발 경험이 부족한 분들이 오해하시고, 로직을 모두 클라이언트에서 처리해 해킹에 무방비 노출되는 사태를 막기 위해서라면 말이죠.

액터 1님도 그걸 지적하신거 같고요.

어쨋든 좋은 글 잘 봤습니다~ ^^

넷텐션
넷텐션Korea
8/9/2010 8:31:00 AM #

└온라인 게임에서 보안을 하는 것은 '클라이언트 보안', '통신 보안', '서버 보안'으로 구분됩니다. (출처: 얼마전 게임보안 세미나 2010) 본 아티클은 통신 보안만을 다루고 있습니다. 클라이언트 보안은 nProtect 등이 담당해줍니다만 nProtect는 통신 보안까지는 다루지 않는 것으로 압니다.