RSA è inutile quando la mia app è completamente decompilata?

8

Ho programmato un gioco Android con Unity Engine. Come sai in Unity, gli script sono stati compilati in un unico file chiamato "Assembly-CSharp.dll". Ho scritto i miei script in C #.

Dopo aver compilato l'intero gioco in .apk, l'ho rinominato in .zip e ho trascinato Assembly-CSharp.dll in strumenti come ILSpy, mentre l'intero programma è stato completamente decompilato con tutti i dettagli come la mia chiave pubblica RSA o AES password, IV, sale ...
La logica della mia app è client (Android) e server (Java).

Quando il giocatore ha completato un livello, con questo URL: link , gli diamo un punteggio. I parametri reali sono username, score, timestamp. Il nostro algoritmo di crittografia è RSA 1024 bit.

Quando cheater / attacker fiuta il traffico HTTP per usare l'attacco di replay, controlliamo l'hash decrittografato con RSA e con il parametro timestamp lo eliminiamo.

Ma quando ha decompilato il codice magnificamente con gli strumenti (ILSpy) ha semplicemente trovato la mia chiave pubblica e ho scoperto che crittografo il punteggio utente e il timestamp con quella chiave pubblica. Quindi, scriverà un programma Unity o C # per crittografare semplicemente il suo messaggio manipolato con un nuovo timestamp e verrà considerato attendibile nella mia app lato server perché tutto è vero.

Aumenterà il suo punteggio inviando richieste HTTP al server senza giocare. Può semplicemente imbrogliare.

Che cosa posso fare?

  1. Non posso usare SSL.
  2. Con l'offuscamento, aumenterà il tempo di crack.
  3. Con la chiave pubblica in runtime dal server al client, i controllori della memoria o gli sniffer del traffico possono semplicemente visualizzare la chiave pubblica.
posta Jimi 09.08.2015 - 19:26
fonte

2 risposte

8

Risposta breve è: Sì, RSA è inutile in questo caso. Se tutta la logica di gioco si verifica sul lato client, non puoi impedire l'imbroglio.

Se il tuo gioco riporta solo il punteggio finale e nient'altro, nessuna crittografia può aiutarti. Il gioco deve sapere come inviare il punteggio e quindi le informazioni complete dovranno sempre essere memorizzate al suo interno. Puoi solo renderlo più difficile per l'imbroglione aggiungendo confusione e altri ostacoli.

Suggerirei due cose:

  • Invia più del solo punteggio finale. Invia alcune informazioni su come il gioco è progredito. (Qual è stato il punteggio in un determinato momento, quando l'utente ha perso la vita, quali decisioni ha preso ...) Quindi verificare sul server se è plausibile ottenere tale punteggio con tale progresso del gioco.
  • Divieto a tutti gli utenti che inviano risultati non validi o che sono stati inviati in precedenza. Assicurati che il tuo gioco produca sempre risultati validi ed è abbastanza casuale da non produrre probabilmente lo stesso risultato due volte. Non devi neppure permettere al truffatore di sapere che è vietato, basta nascondere il suo punteggio da qualsiasi elenco pubblico.
risposta data 09.08.2015 - 21:22
fonte
0

Se il tuo cliente può inviare l'ora, il server potrebbe emettere certificati per la chiave pubblica per il client con una scadenza invece di codificare la chiave pubblica nella tua app.

    
risposta data 09.08.2015 - 20:37
fonte

Leggi altre domande sui tag