소켓을 통한 멀티 플레이어 게임 인증


11

현재 작업중인 새로운 멀티 플레이어 게임을위한 맞춤형 바이너리 프로토콜을 구현하고 있습니다. 턴 기반 전략 게임이므로 타이밍은 중요하지 않습니다. 현재 시스템의 기본 데이터 동기화 부분이 완료되었으며 MMORPG 게임 또는 이와 유사한 경우 사용자 로그인 / 로그 아웃 및 암호화가 어떻게 수행되는지 궁금합니다.

  • 로그인시 보안 / 비밀번호 전송 체계를 권장 할 수 있습니까? (Diffie-Hellman 키 교환?)
  • 데이터 패킷에 대한 강력한 암호화를 어떻게 구현합니까? (AES 128 비트? .. 또는이 게시물 에서 "크랙 가능성보다 강한 암호화"라고 언급하는 방식 )
  • 게임 서버가 공격, 유효하지 않은 데이터 패킷 등을 재생하도록 강화하는 데 도움이되는 데이터 그램 형식 체계가 있습니까?

답변:


15

답변

  • SRP- 보안 원격 비밀번호-이것은 Diffie-Hellman을 기반으로합니다. 아이디어는 실제로 암호 나 암호를 도출하는 데 사용할 수있는 정보를 전송하지 않고도 상호 암호 검사를 수행 할 수 있다는 것입니다. 유선으로 안전하더라도 서버는 절대 일반 텍스트로 암호 를 저장 해서는 안되므로 여전히 암호 해시하고 소금을 칠 해야합니다 .
  • SRP의 장점은 완료되면 상호 협상 된 암호화 키를 제공하므로 공격자가 전송 한 데이터에 대해 추론 할 수 없었습니다. 즉, 사용자가 인증되면 AES와 같은 대칭 암호화 알고리즘을 자유롭게 사용할 수 있습니다.
  • UDP를 자체의 신뢰할 수 있고 순서가 지정된 (연결 지향적) 구현과 함께 사용한다고 가정하면 '패킷 시퀀스 번호'를 포함하여 전체 UDP 재생로드를 암호화하십시오. 시스템이 올바르게 설계된 경우 재생 된 메시지를 자동으로 거부하고 침입자는 암호화되어 있기 때문에 패킷 시퀀스 번호를 변경할 수 없습니다 (따라서 재생이 가능하지만 자동으로 무시 됨).

생각

인증이 안전해야합니까? 물론. 비밀번호에 문제가있을 때 보안 측면에서 타협하지 마십시오. 따라서 당신은 분명히 내 대답의 첫 번째 글 머리 기호를 고려해야합니다.

데이터가 안전해야합니까? 게임 내 구매 / 소액 거래 인 경우에만 HTTPS와 같은 시도되고 진실 된 것을 사용하지 않는 이유는 무엇입니까? 게임 트래픽을 암호화하는 것은 다음과 같은 이유로 실행 가능한 솔루션이 아닙니다.

  • 완전 편집증입니다.
  • (고가의) 하드웨어 암호화 모듈을 구입할 수 없다면 서버에 CPU 시간 오버 헤드가 추가 될 것입니다.
  • 유선으로 데이터를 제공하는 보안의 정도는 중요하지 않습니다. 누군가가 클라이언트 프로세스를 가로 채서 메시지가 암호화되고 전송되기 직전에 메시지를 가로 챌 수 있습니다. 이 가능성하지만만큼 무한히 수뿐만 아니라 실질적으로 쉽게 분사 코드 패킷들을 인터셉트 비교. 치트 예방을 위해이 작업을 수행하는 경우 시간이 완전히 낭비됩니다.
    • 암호 보안의 측면에서 유감스럽게도 납치 된 시스템에 대해 합리적으로 할 수있는 일은 없습니다. 클라이언트가 적대적이되었습니다. 블리자드 와우 동글은 이것을 처리하도록 설계되었지만 보안이 얼마나 안전한지 잘 모르겠습니다 (특히 플러그를 꽂아두면).

제발 당신이 사기 방지를 위해 암호화하는 경우를 포기. 당신은 짧게 올 것입니다-나는 당신에게 그렇지 않은 경우에 당신에게 정보를주었습니다. 패킷의 첫 번째 바이트로 패킷을 선택적으로 암호화하고 나머지는 암호화되는지 여부를 표시 할 수 있습니다.하지만 신용 카드 거래와 같은 일을 해야하는 경우 HTTPS를 계속 사용합니다. 매우 드물고 HTTPS는 귀하 또는 본인이 설계 한 것과 달리 전문가가 설계합니다.

블리자드 는 실제로 와우 트래픽을 암호화 합니다. 이것이 깨어진 주된 이유는 완전한 아마추어 일 가능성이있는 누군가가 집에서 만든 암호화 알고리즘을 시도하기로 결정했기 때문입니다. 이것은 정말 잘 펼쳐졌다 . 산업 표준 알고리즘을 사용하더라도 누군가가 코드를 리버스 엔지니어링 하고 시뮬레이션 할 가능성이 높습니다 . 클라이언트가 비밀번호를 입력하면 지원되지 않는 시스템이 연결되었다는 메시지가 표시되지 않습니다.


2
치트 방지를 위해 데이터 패킷을 암호화하는 것은 쓸모 없다고 +1합니다. 영업 이익 : 확인 할 모든 클라이언트가 요청한 조치가 가능한 경우, 체크 무기 범위, 이동 속도 등을 클라이언트로부터받은 실행 정신 검사, 더블 체크를하지만이 같은 고객을 확보 시간을 낭비하지 않는 것입니다 경우 해킹 얻을 당신의 게임은 그만한 가치가 있습니다. 일부 MMO 회사는 고객 / 프로토콜을 암호화하고 난독 처리하지만 부정 행위 를 방지 하는 것이 아니라 봇 제작자가 좋은 결과를 얻는 것을 더 어렵게 만듭니다. 심지어 전담 전문가 팀이이를 수행하기도합니다.
길르앗

1
세 번째 답변에 대한 사소한 문제 : 많은 암호화 체계가 적어도 다소 가변적 이므로 패킷을 암호화하는 것만으로는 변조를 방지하기에 충분하지 않을 수 있습니다 . 메시지 무결성을 보호하려면 MAC 또는 인증 된 암호화 모드 가 필요 합니다 .
Ilmari Karonen

+1 매우 완전한 답변을 주셔서 감사합니다. 지금 SRP 구현을 고려 중입니다. 암호에 사용되는 해시 기능에 대한 권장 사항은 무엇입니까? MD5? OTR 프로토콜 (Off the Record)은 이러한 사용 사례에 어떤 영향을 미칩니 까? SRP 대신 인증 / 암호화에서 잘 작동합니까? SRP를 사용하는 경우 다음 "인증 된 암호화"모드 중 하나를 사용해야합니까? (OCB 2.0, Key Wrap, CCM, EAX, Encrypt-then-MAC 및 GCM)
Robinicks 2014 년

1
@Jenko는 SHA 계열 알고리즘 (예 : SHA1)을 사용합니다. 요즘 MD5는 피해야합니다. OTR은 실제로보아야 할 것이 아닙니다. 보안 / 모호하지 않도록 설계되지 않았습니다 (실제로 누군가가 쉽게 패킷을 위조 할 수 있도록 설계됨 ). 또한 인스턴트 메시징 용으로 설계되었으며 기계 통신이 아닙니다. 이러한 모드 중 어느 것도 필요하지 않습니다. SRP를 사용하십시오. 일단 상호 협상 된 대칭 키가 있으면 단순히 무언가를 암호화 할 수 있다는 것은 올바른 제 3 자와 대화 할 수있을만큼 보장됩니다. 또한 마지막 두 단락을 다시 읽으십시오.
Jonathan Dickinson

1
사실, 더 나은 제안이 있습니다 : 기존의 DTLS over UDP 구현을 사용하고 자신의 롤을 시도하지 마십시오. 그것은 당신에게 시간을 절약 할 수 있습니다, 그리고 거기에 많은 자신의 데이터 그램 암호화 층을 설계하려고하면 잘못을 쉽게 얻을 수있는 작지만 중요한 세부 사항은.
Ilmari Karonen

2

조나단의 탁월한 답변에 대한 나의 마지막 의견 은 그 자체의 답변으로 확장 가치가 있다고 생각합니다 .

암호화 경험이 많지 않으면 피할 수있는 경우 자체 암호화 계층을 설계하지 마십시오. 당신이 경우 어떻게 암호화 많은 경험을 가지고, 당신은 당신이 그것을 피할 수 있다면 자신의 암호화 층을 설계하는 것보다 더 잘 알고 있어야합니다.

대신, 필요한 표준화 된 잘 테스트 된 기존 암호화 라이브러리를 찾아보십시오. 귀하의 경우, Wikipedia에 따르면 TLS-SRP 인증 ( RFC 5054 )과 DTLS 와의 안전한 UDP 통신 ( RFC 6347 )을 모두 제공 하는 GnuTLS를 추천 합니다 . 전자는 로그인을 관리하고, 후자는 도청 및 능동 공격으로 형성된 보안 채널을 보호하며 재전송 공격으로부터 사용자를 보호 할 수도 있습니다 .


TCP를 사용하고 있습니다. 이것은 특정 고객을위한 매우 다른 종류의 게임입니다. 도박 / 베팅과 마찬가지로 프로세스를 가로채는 데 사용할 수있는 모든 정보는 집에서 불필요한 손실을 입을 가능성을 높입니다. 이 경우 정보는 돈이기 때문에 데이터를 매우 안전하게 유지해야합니다.
Robinicks 2016 년

TCP를 사용하는 경우 훨씬 더 쉽습니다. DTLS 대신 일반 TLS 1.2를 사용할 수 있으므로 더 많은 옵션을 선택할 수 있습니다. 그래도 GnuTLS 라이브러리를 추천합니다.
Ilmari Karonen

약간의 연구를 수행하고 클라이언트 및 서버 측에서 TLS 소스 코드를 참조하고 프로토콜을 기반으로 프로토콜을 수행 할 수 있는지 확인합니다. 이것이 충분히 강할까요? 본질적으로 일부 암호 / 모드를 사용한 패킷 암호화입니다. 맞습니까?
Robinicks

아니요, TLS 프로토콜 보다 훨씬 더 많은 것이 있습니다. 그렇기 때문에 자신의 롤링 대신 라이브러리를 구현하는 표준 라이브러리를 사용하려고합니다.
Ilmari Karonen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.