2016-02-13 20 views
8

Recentemente il mio gioco è stato violato e un utente ha inviato un punteggio impossibile al server. Il punteggio è stato presentato con un checksum verificato e dati corretti.Come verificare che i dati POST vengano inviati dall'app Android con la firma SHA1 corretta?

Sono convinto che l'utente debba aver decodificato il mio file APK per trovare la richiesta POST.

Ora mi chiedo quale sarebbe un buon modo per evitare che ciò accada di nuovo e ho pensato di verificare la firma SHA1 dell'app. Forse in questo modo posso essere sicuro che l'app sia firmata da me e non sia una versione modificata e modificata della app.

Questo sarebbe possibile? O ci sarebbe una soluzione migliore per risolvere questo?

Sto utilizzando LibGDX a proposito.

+0

Cosa avrebbe trovato in più nella richiesta di posta cosa non riusciva a trovare con un snifler di rete? – greenapps

+0

@greenapps Un checksum – Z0q

+0

aggiunge campi nell'intestazione http. – zakaiter

risposta

3

Prima di tutto, devi davvero offuscare il tuo codice. È possibile trovare ulteriori informazioni su ProGuard e l'offuscamento del codice here.

In secondo luogo, è possibile utilizzare GoogleAuthUtil disponibile in Google Play Services, disponibile per dispositivi con Android 2.2 o versioni successive.

GoogleAuthUtil fa esattamente quello che vi serve:

GoogleAuthUtil server communication

Le chiamate client server vanno a Google tramite una richiesta HTTPS, Google controlla se la chiamata viene effettuata da un app firmato con il certificato di rilascio, e quindi invia la richiesta al tuo server.

È possibile trovare tutorial ufficiali su come implementare questo here e documentazione ufficiale here.

Cheers!

1

Verificare l'integrità della tua app non sarà sufficiente, dal momento che la richiesta può essere facilmente falsificata all'esterno dell'applicazione o modificata in tempo reale, utilizzando un ambiente Android rootato. Ancor più, non è possibile evitarlo completamente.

Questo è un problema condiviso da tutte le applicazioni in esecuzione su una macchina fuori dal proprio controllo (tutte le applicazioni client). Non puoi mai fidarti dei dati che provengono da loro.

Come posso vederlo, si hanno diverse scelte:

  1. offuscare il codice e rendere l'applicazione più difficile da essere reverse-engineering. Si noti che questo non risolve il problema, ma lo riduce al minimo.
  2. Sposta l'elaborazione sul server. Più il gioco è controllato dal server, meno vulnerabile sarà l'app a questo comportamento malevolo.
  3. Rileva automaticamente i punteggi impossibili e chiudere i loro conti

Cheers,

+0

Non credo che possa essere facilmente falsificato. È necessario registrare la chiave SHA1 per utilizzare Google Play Games. Sembra che possano vedere se l'app è originale o una versione pirata. – Z0q

+0

Non intendo con altre applicazioni nel telefono. Voglio dire con altre applicazioni client HTTP che simulano la richiesta originale, e conoscere il codice sorgente e annusare la conversazione HTTP dell'app originale può essere fatta. Modifico la mia risposta per fare riferimento ad un Android rooted – idelvall

1

Se si desidera verificare la firma della vostra applicazione, senza la possibilità che questo è rotto troppo, si dovrebbe caricare l'intero apk e fare il controllo su un server. Questa non è una soluzione praticabile.

L'unica app Android sicura è una pura app terminale, il che significa che dovresti fare tutto il calcolo su un server. Il più delle volte ciò non sarà possibile a causa della latenza.

Ecco perché noi sviluppatori Android dobbiamo convivere con questo: un'app non è sicura al 100%.

Ma ci si può avvicinare.

Si consiglia di leggere la guida Security with HTTPS and SSL per garantire la comunicazione.

Inoltre si vuole garantire il vostro cliente è difficile da decifrare: android app piracy prevention e Combating Android App Piracy: Xposed

Nel tuo caso si potrà anche implementare richiesta sul lato server di validazione: Se si dispone di un gioco con un server lato, gli utenti probabilmente hanno un account. Se un utente invia un punteggio chiaramente impossibile, ignorare automaticamente la richiesta e vietare l'utente (e il suo ip). (Ma ho anche in mente che questo non dovrebbe mai accadere a una richiesta valida, altrimenti gli utenti potrebbero arrabbiarsi e smettere di giocare.)

2

1) Utilizzare code obfuscation per es. Proguard. Questo tipo di strumenti disponibili non solo per Java. Ma attenzione: il codice offuscato potrebbe funzionare lentamente o contenere ulteriori bug.

2) Aggiungere App Licencing di controllo (questo controllerà firma app con Google Play):

Guarda questo video con attenzione: https://www.youtube.com/watch?v=TnSNCXR9fbY Per quanto mi ricordo egli menziona le tecniche utilizzate in fase di esecuzione per verificare la tua app non modificata o modificata (controllo zip, ecc.).

3) Assicurarsi che l'app/server utilizzi la connessione protetta (SSL/TLS) solo con suite di crittografia MODERN. Ciò mitigherà gli attacchi di downgrade.

È possibile utilizzare questo generatore di costruire config con suite di cifratura moderni per il vostro server: https://mozilla.github.io/server-side-tls/ssl-config-generator/

Inoltre è possibile utilizzare il certificato struggimento sul lato client - questo mitigherà attacco autorità.

Non utilizzare una connessione HTTP semplice.

4) utilizzare una sorta di richiesta la firma (idea come Amazon AWS fa) È possibile ottenere nucleo dai loro documenti. http://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html

Anche this article dovrebbe essere utile.

5) Vietare l'utilizzo della vostra app su ROOT dispositivi con aggiunta di controllo di runtime. A causa del telefono rooted è più semplice hackerare o analizzare la tua app.

6) Puoi ridurre le frodi aggiungendo un sistema di divieto al tuo gioco online - se qualcuno ha hackerato la tua app e invia dati errati al tuo server => aggiungi questo utente per escludere l'elenco sul lato server (tramite IP o ID utente , eccetera).Probabilmente aggiungere temporaneamente gli utenti a questa lista (ex 24 ore, 7 giorni)

7) + se si utilizza Json/XML come formati di dati per il livello di rete, provare a utilizzare il formato binario come Protocol Buffers. Formati di serializzazione binaria più efficienti e difficili da decodificare.

+0

Non sono assolutamente d'accordo con # 5. – WhoIsJohnDoe

+0

@WhoIsJohnDoe Si prega di descrivere perché la pensi così? – dasar

+0

Esistono più casi di utilizzo validi per il rooting del dispositivo. Capisco la logica dietro, ma non sono ancora d'accordo con l'esclusione di una parte della base utente solo perché "è più facile". – WhoIsJohnDoe

1

È possibile offuscare meglio il codice e utilizzare un segreto molto offuscato per firmare le richieste. Con quello puoi aumentare la sicurezza.

Ma se tutto il tuo gioco viene eseguito nel client, non può essere completamente sicuro. Perché non importa ciò che usi per firmare, se lo fai nel client significa che hai la chiave segreta o privata nel client e poi può essere violato.

Per rendere più sicuro è necessario coinvolgere alcune logiche di gioco nel server e quindi controllare in quella logica che l'utente non sta barando.