Szyfrowanie przesyłania wyników gier



Problem

W konkursach (zwłaszcza tych z nagrodami) zawsze pojawia się grupa osób chcących wpłynąć na wyniki (hacking).

Idea

Postanowiliśmy użyć Adobe Alchemy w celu szyfrowania komunikacji klient-serwer przez algorytm kryptograficzny.

Rozwiązanie

Kompilator Alchemy projekt badawczy firmy Adobe który pozwala użytkownikom na skompilowanie kodu C i C++ do kodu ActionScriptu 3. Taki kod bajtów może być z kolei wykonywany przez Flash Playera i środowisko AIR. Celem projektu jest umożliwienie korzystania z niezależnych od systemów operacyjnych bibliotek w C i C++ przez aplikacje sieciowe. Co ważne, dostępne na rynku programy do dekompilowania plików SWF oraz kodu napisanego w ActionScript (np. SWF Encrypt, Mochicrypt, Secure SWF, DoSWF), nie potrafią prawidłowo odtworzyć kodu skompilowanego za pomocą Alchemy.

Wykorzystaliśmy algorytm kryptograficzny, który do szyfrowania i deszyfrowania tekstu jawnego wykorzystuje klucz Rijndael.

Przykładowe dane przed zakodowaniem:
var input : String = „”;
// Tekst.
input = input + „zażółćgęśląjaźń” + „;”;

// Liczba całkowita.
input = input + 123 + „;”;

// Liczba zmiennoprzecinkowa.
input = input + Math.PI + „;”;

// Identyfikator globalnie unikatowy.
input = input + UIDUtil.createUID () + „;”;

//zażółćgęśląjaźń;123;3.141592653589793;707A00DC-D463-048B-CEF8-2072F2204F1F;

Te same dane po zakodowaniu:
D34DB6DE4EDBFB425E551D1175009F8C
8A934F3B2AFFC92F6539E148207D1A4B
2996BE0B53CEF84159EA67B6F18240E0
A2315EEF39FAE6EFF920028BB410851B
8BDC56C13009C96BB93404A65C50C571
12F89AEABE5E34E2E056DBD23D9BAADF

Odtworzenie informacji po stronie serwera (PHP):
$hex = ZAKODOWANE_DANE;
$cipher = mcrypt_module_open ( MCRYPT_RIJNDAEL_128, ”, MCRYPT_MODE_CBC, ” );
$key = pack ( „H*”, ’6369706865724031383068622E636F6D’ );
$s = mcrypt_generic_init ( $cipher, $key, $key );
$data = pack ( „H*”, $hex );
$decrypted = mdecrypt_generic ( $cipher, $data );
mcrypt_generic_deinit ( $cipher );
print_r ( explode ( ‘;’, $decrypted ) );

Posłowie

Użycie szyfrowania komunikacji klient-serwer przez algorytm kryptograficzny powinno być jednym, ale nie jedynym zabezpieczeniem naszej aplikacji. Istnieje szereg różnych sposobów, które mogą posłużyć w walce z nieuczciwymi graczami. Warto poświęcić czas na ich implementację. Do najważniejszych należą:

-Minimalizacja liczby zmiennych globalnych.
Zmienne globalne mogą być w prosty sposób odnalezione w pamięci RAM komputera i zmodyfikowane, dlatego nie powinno się przechowywać w nich ważnych wartości.

-Użycie szyfrowanej wersji protokołu HTTP.
Zamiast używać w komunikacji klient-serwer niezaszyfrowany tekst, szyfrować go za pomocą protokołu SSL. Zapobiega to przechwytywaniu i zmienianiu przesyłanych danych.

-Zabezpieczenie aplikacji przy użyciu encryptora.
Użycie encryptora może znacznie utrudnić zdekompilowanie / podejrzenie kodu aplikacji, jednak nie daje 100% pewności, że kodu nie da się odtworzyć.

-Architektura „cienki” klient.
Część aplikacji stworzonej w architekturze klient-serwer obsługiwana przez użytkownika. Cechą szczególną cienkiego klienta jest brak funkcji służących przetwarzaniu informacji, jego rolą jest wyłącznie pobieranie i prezentacja „surowych” danych. Przykładem cienkiego klienta może być witryna WWW z serwisem transakcyjnym banku internetowego. Użytkownik może sprawdzać za pomocą przeglądarki internetowej stan rachunku i wydawać dyspozycje, lecz weryfikacja danych (np. kontrola salda) jest przeprowadzana po stronie serwera.

AlchemyCrypto (ZIP, 448 KB)

Pobierz próbkę do badania

Szymon Piotr Pepliński Szymon Piotr
Pepliński
Head of Innovation