데이터 번들 / 암호화를 위해 무엇을 사용합니까?


14

점점 더 많은 게임이 데이터 중심 경로로 가고 있습니다. 즉, 조작하기 쉬운 보안 계층이 필요합니다. 게임이 자산 (오디오, 아트, 데이터)을 완전히 묶는 곳을 보았는데 어떻게 관리하고 있는지 궁금합니다. 자산을 번들로 묶고 관리 할 수있는 응용 프로그램 / 라이브러리가 있습니까? 그렇지 않은 경우 포장 / 포장 풀기 / 암호화에 대해 지적해야 할 리소스가 있습니까?

이 특정 질문은 C ++을 중심으로하지만 C # / XNA에서 어떻게 관리되는지 들어 볼 수 있습니다.

명확하게 말하면 해킹을 방지하는 솔루션을 설계하지는 않습니다. 기본적으로 우리는 모두 0과 1을 조작합니다. 그러나 우리는 게임을하는 사람들의 99 %가 단순히 게임 세계를 구축하는 데 사용되는 XML 파일을 수정하지 못하도록하고 싶습니다. 많은 게임이 모든 리소스를 묶는 것을 보았습니다. 나는 그들이 사용하는 방법에 대해 궁금합니다.


좋은 질문, 내가 그것을 100 % 보호 할 수있는 방법이 있다고 믿지 않는 동안, 나는 그것을 압축하고 난독 화하는 깔끔한 방법이 있다고 믿습니다. 그리고 그것에 대해 더 알고 싶습니다 ...
— Prix

아트 / 오디오 자산이 "민감한"것으로 간주되어야하는지에 대한 의문의 여지가 있습니다. 건전한 모드 커뮤니티를 지원하기 위해 많은 게임이 의도적으로 자산을 플레이어에게 노출하여 게임에 더 많은 가치를 부여 할 수 있습니다 (실제로 개발자에게도 비용이 들지 않음).
— Ian Schreiber

주로 데이터 중심 게임 (예 : xml 파일)을 구동하는 민감한 데이터에 관심이 있습니다. 방금 게임이 모든 것을 하나 또는 두 개의 파일로 묶는 것을 보았습니다.
— David McGraw

4
플레이어들이 그 데이터를 가지고 놀 때 무엇이 ​​문제입니까?
— jsimmons

답변:


8

좋은 전략은 아카이브 형식을 처음부터 새로 작성하고 아카이브에 전체 순차 파일을 저장하는 대신 데이터 청크를 가리키는 테이블을 사용하여 색인화 된 형식으로 만든 다음 LZMA /를 사용하여 인덱스 테이블을 암호화하고 모든 청크를 별도로 압축하는 것입니다. Bzip2.

또 다른 접근법은 여기저기서 약간의 절차 적 데이터 생성기를 사용하는 것입니다. (원하는 경우 추가 측정으로 온라인 서버에서 해당 생성기에 대한 '파라미터'를 얻을 수도 있습니다) 일부 작업을 오프로드하여 GPU에서 전체 메모리 덤프를 방지하고 손실 된 성능을 보완 할 수도 있습니다.

그러나 나는 일반적으로 성능과 낭비 개발 시간을 방해하는 이러한 기술을 발견하는 동시에 최종 사용자에게 아무것도 제공하지 않고 잠재적 인 문제와 불필요한 버그를 제공합니다.

그럼에도 불구하고 100 % 안전한 것은 없습니다.


이것을 위해 +1. 압축은 난독 화의 필요성을 모두 충족 시키며 로딩 시간과 앱 설치 공간을 향상시킵니다. 데이터의 아카이브 / 패킹에는 어쨌든 추상화 계층이 필요하므로로드 / 압축 해제 할 수있는 것과 결합하는 것이 너무 많은 엔지니어링이되어서는 안됩니다. 압축을 사용하는 경우 압축 / 압축 해제 논리를로드 / 아카이브 항목과 별도로 유지해야합니다. 이렇게하면 나중에 더 나은 알고리즘으로 교체 할 수 있으며 필요한 인프라는 알고리즘간에 변경되지 않습니다.
— MrCranky

@MrCranky : EA가 .package (DBPF) 아카이브 형식 (SPORE 및 The Sims 게임에서 사용)을 사용하여 EA가 수행하는 방식을 살펴보면 실제로이 동작을 볼 수 있습니다. 엔진에는 인덱스 테이블에 "압축 유형"에 대한 추가 필드가 있으며, 어떤 알고리즘을 사용할 것인지에 대한 내부 코드가 있습니다. 청크 유형에 따라 다른 압축 알고리즘을 사용합니다 (예 : 텍스트 청크는 특수 압축을 사용합니다). 사용하는 버전 관리 시스템은 모드 통합 및 이전 버전과의 호환성도 허용합니다. DBPF 형식에 대한 자세한 내용은 다음을 참조하십시오 : simswiki.info/DatabasePackedFile
— voodooattack

흥미로운 것들 : 컴파일 타임에 #define으로 만 해왔지만 런타임은 몇 가지 좋은 가능성을 열어줍니다 (예 : 게임의 모든 파일을 다시 만들지 않고도 압축 유형을 변경할 수 있음).
— MrCranky

11

민감한 데이터를 배송하지 마십시오.

게임 만 액세스 할 수 있도록 암호화 된 데이터를 배송 할 방법 이 없습니다 . 정말 열심히 노력할 수는 있지만 DRM 문제에 신속하게 대처할 수 있습니다.

게임 자산을 눈에 띄지 않게하려면

  1. 그것을 압축
  2. xor 파일
  3. 확장 기능을 지루한 것으로 바꾸십시오 (즉 my_level.zip.xor, 사용 하지 마십시오 my_level.map).

이는 허위 사용자의 95 %를 중지시킵니다. 다른 5 %는 당신이 무엇을하든 얻을 것입니다.
실제로 압축 할 필요는 없습니다 xor. lzma 대신 알려진 키로 AES를 사용할 수 있습니다. 요점은 그것에 많은 시간을 소비하지 않는 것입니다.


그게 내가 보통 대부분의 게임에서 볼 수있는 것입니다 ... 쿠키.
— Prix

2
실제로 zip + rename만으로 충분할 것입니다.
— coderanger

1
나는 그렇게 생각하지 않는다. 나는 그것을 That will stop 95% of mischeivieous users.깨뜨리는 것을 좋아한다. 나는 실제로 그것을 얻는 사람들이 여전히 있다고 생각한다. 요즘 대부분의 10 살짜리 아이들은 메모장에서 파일을 열고 이름을 바꾸는 방법을 알고 있습니다.
— Prix

1
어떻게하는지 알아 신경 쓰지 않겠어요
— coderanger

zip + 이름 바꾸기로는 충분하지 않습니다. 리눅스는 파일 형식을 결정하기 위해 파일 확장자를 거의 사용하지 않습니다. 대신 처음 몇 바이트를보고이를 사용하여 유형을 결정합니다. 이름이 바뀐 zip은 Linux에서 여전히 zip으로 표시됩니다. Windows XP는이 작업을 수행하지 않으며 여전히 확장명을 사용합니다. Windows7이 어떻게 작동하는지 모르겠지만 앞으로 Windows에서 비슷한 기술을 사용할 것으로 기대합니다.
— deft_code

4

이것에 많은 시간을 소비하는 것은 어리석은 일입니다. GPU에서 직접 텍스처 및 모델 데이터를 가져 오는 도구가 있으며 가상 루프백 장치에서 사운드를 쉽게 가리킬 수 있습니다. 진정으로 안전해야하는 것은 서버에 있어야하며 챌린지 / 응답을 통해서만 작동해야합니다. 클라이언트 데이터 유효성 검사는 Valve의 -verify_all과 같은 또 다른 이야기입니다. 로컬 실행 파일을 실행하여 신뢰할 수 없기 때문에 (또는 적어도 엔드 포인트 치트 방지 시스템을 신뢰하는 것 이상으로 신뢰할 수는 없습니다. 어리석은 생각입니다).


4

내 직업은 탬 퍼링 방지 소프트웨어입니다. 나는 구식 게임 크래커 인 누군가를 안다. 그는 숨쉬는 것과 같은 게임을한다. 당신은 그와 같은 사람들을 막을 수 없습니다. 게임이 충분히 인기가 있다면, 게임의 여러 크랙 버전은 사용자가 무엇을하든 출시 후 며칠 후에 토렌트 사이트에 충돌합니다. 내 충고는이 리버스 엔지니어링을 찌르기를 원할 것이라고 생각하는 평균 조를 막기 위해 최소한의 노력을 기울이는 것입니다.


1
그것이 목표입니다. 나는 해커와 싸우고 싶지 않다.
— David McGraw

1

좋은 질문이지만 대답하기 쉽지 않습니다.
데이터 보안에 대한 나의 경험에서 다음에 대해 생각해야합니다.

1) 데이터가 안전하지 않은 경우 보안 대상은 누구이며, 그 영향은 무엇입니까-보안은 체계적인 기술 솔루션보다 위험 평가에 훨씬 더 중요합니다.
2) 귀하의 플랫폼이 데스크톱 (예 : Windows / OSX)이라고 가정합니다. 커널 수준 보안에 대한 자체 시도가있는 PS3 / Xenon과 같은 독점 하드웨어와는 다른 문제 공간 (이는 유효한 솔루션인지 토론 가능)
3) 암호화! = 보안. 암호화는 데이터가 될 수 없음을 보장 읽기 , 그것은 데이터가 될 수 없음을 보장하지 않습니다 기록 또는 재생이 / 프록시.

데이터 변조 방지 요구 사항을 충족해야하는 경우 데이터 해싱 에 대해 고려해야 합니다 (SHA-256 또는 SHA-512를 사용하는 것이 좋습니다). 체계.
또한 제품에 암호화 기술을 추가 하면 수출 제한 (암호화 기술이 제한된 무기 등급 기술로 분류 됨)으로 인해 법적 영향을 미칠 수 있으므로 이러한 법적 문제를 극복 한 라이브러리를 사용하는 것이 좋습니다.
마지막으로, 절대 자신 만의 암호화 기술을 사용하지 마십시오. AES, Blowfish, RSA 등과 같이 잘 알려져 있고 문서화되고 연구 된 알고리즘을 사용하십시오.

ps 공개 / 개인 키는 대량의 데이터를 암호화하는 데 적합하지 않거나 실용적이지 않으므로 DRM / PGP 등은 하이브리드 RSA + 대칭 시스템을 사용합니다 즉, RSA로 대칭 키를 보호 한 다음 해당 키를 사용하여 표준 대칭 암호화를 수행합니다.

그것은 매우 큰 복잡한 주제이며 나는 분명히 그것을 정의하지 않았습니다.

희망이 도움이


1

작고 (압축 가능하며) 엄청나게 안전하고 유연하도록 디자인되고 제작 된 (아마도 오버 엔지니어링 된) 형식의 예를 원한다면 블리자드의 MPQ 형식을 살펴 봐야합니다.

http://wiki.devklog.net/index.php?title=The_MoPaQ_Archive_Format

일반적인 아카이브 레이아웃은 다음과 같습니다.

아카이브 헤더 파일 데이터 파일 데이터-특수 파일 해시 테이블 블록 테이블 확장 블록 테이블 강력한 디지털 서명

이 형식에는 모든 것이 있습니다. 차단 가능, 확장 차단 가능, 데이터를 섹터로 분할 (쉽게 스트리밍 가능), 임의로 결합 할 수있는 7 (!) 압축 알고리즘 (사운드 압축을 계산하는 경우), 약한 디지털 서명, 강력한 디지털 서명 등을 지원합니다.

파일 아키텍처를 다루는 블리자드에서 API를 구입하면 필요한 모든 것을 얻을 수 있습니다.


링크에 대한 감사합니다, 나는 MPQ의 세부 사항에 더 많은 볼 생각하지 않을 것 (일반적으로 그들이 사용할 수있을 거라고 가정)
— 빌

그것이 매우 안전하다면, 왜 그런 정도까지 리버스 엔지니어링되었으며 타사 라이브러리와 상호 작용할까요? ;-)
— coderanger

* .mpq 파일과 상호 작용하는 대부분의 (읽기 : 모두) 도구는 한 사람이 작성하고 유지 관리하는 Stormlib에 따라 다릅니다.

내가 아는 한, Stormlib은 암호 해독 키가 실행 파일에 저장되어 있기 때문에 아카이브에서 유래 한 원래 게임이 필요합니다. 그러나 이것이 가장 안전한 이유는 침입이 불가능하기 때문이 아닙니다. 그러나 인터넷을 통해 전송되는 온더 플라이 데이터의 경우 그 누구에게도 뒤지지 않습니다. 데이터가 너무 많이 암호화되어 제 3자가 즉시 해독 할 수 없게됩니다.

실제로 'World of Warcraft'에서 블리자드는 스트리밍 기술을 개척하여 하드 드라이브에 다운로드 한 전체 데이터의 몇 퍼센트만으로 게임을 즐길 수 있습니다. * .mpq 형식은 이런 종류의 작업에 탁월합니다. 게임의 공식 출시 전 며칠 전 블리자드가 Starcraft 2 설치 프로그램을 출시했을 때 아카이브가 너무 많이 암호화되어 게임이 출시 된 후까지는 열 수 없었습니다. : P

0

이것이 최근에 부활되었으므로 귀하의 질문 (및 지금까지의 모든 대답)은 파일로드 만 처리하는 것처럼 보이며 파일을로드하려는 실행 파일만큼 안전합니다. PC에는 실제로 안전한 것은 없습니다 (사람을 지연시키는 것만). 서버의 항목을 검사 할 수는 있지만 그 검사조차 제거 할 수 있으므로 수정 된 exe가 무엇이든간에 실행될 수 있습니다. 콘솔은 여전히 ​​"꽤"안전하므로 대부분의 경우 중요한 파일의 해시를 생성 한 다음 개인 키로 해시에 서명하고 공개 키를 코드에 포함시키고 파일에 대한 보안 해시를 확인합니다.

나는 대화에 또 다른 공격을 던질 것이라고 생각했는데, 작년에 PC에 많은 것을 제공하지 않기 때문에 나는 만났다. 치트 엔진 은 거의 모든 프로그램을 사용할 수 있도록 해킹을 거의 자동화하는 매우 깔끔한 프로그램입니다. 그것은 사람들이 판매하는 것을 보았던 많은 해킹 / 속임수가 내가 본 것 (모든 대중 시장)에서 만들어 낸 것과 비슷한 방식으로 만들어졌습니다. 몇 가지 작업을 통해 이와 같은 것들로부터 다시 보호 할 수 있습니다. 게임의 인기와 누군가가 귀찮게 신경 쓰는지에 달려 있다고 생각합니다.

암호화 (C ++에서)에 대한 좋은 lib를 언급하는 것을 잊어 버렸습니다 .LibTomCrypt 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.