2016-02-13 7 views
8

Kürzlich wurde mein Spiel gehackt und ein Benutzer hat eine unmögliche Punktzahl an den Server gesendet. Das Ergebnis wurde mit einer verifizierten Prüfsumme übermittelt und die Daten wurden korrigiert.Wie verifiziert man, dass POST-Daten von einer Android-App mit korrekter SHA1-Signatur gesendet werden?

Ich bin davon überzeugt, dass der Benutzer meine APK-Datei umgekehrt haben muss, um die POST-Anfrage zu finden.

Jetzt frage ich mich, was wäre ein guter Weg, dies zu verhindern, passiert wieder und ich dachte über die Überprüfung der SHA1-Signatur der App. Vielleicht kann ich auf diese Weise sicherstellen, dass die App von mir signiert ist und keine Reverse Engineering Version der App ist.

Wäre das möglich? Oder gibt es eine bessere Lösung, um das zu lösen?

Ich benutze LibGDX übrigens.

+0

Was hätte er extra in der Post-Anfrage gefunden, was er mit einem Netzwerk-Snifler nicht finden konnte? – greenapps

+0

@greenapps Eine Checksumme – Z0q

+0

Felder in http-Header hinzufügen. – zakaiter

Antwort

3

Zuerst müssen Sie wirklich Ihren Code verschleiern. Sie können weitere Informationen über ProGuard und Code-Verschleierung here finden.

Zweitens können Sie GoogleAuthUtil in Google Play Services verwenden, das für Geräte mit Android 2.2 oder höher verfügbar ist.

GoogleAuthUtil tut genau das, was Sie brauchen:

GoogleAuthUtil server communication

Ihre Client-Server-Anrufe über eine HTTPS-Anforderung gehen zu Google, Google überprüft, ob der Anruf von einer App unterzeichnet mit Ihrer Freigabebescheinigung gemacht wird, und dann sendet es die Anfrage an Ihren Server.

Sie können offizielle Anleitungen zur Implementierung dieses here und der offiziellen Dokumentation here finden.

Prost!

1

Die Überprüfung der Integrität Ihrer App wird nicht ausreichen, da die Anfrage leicht außerhalb der App gefälscht oder spontan im Speicher geändert werden kann, indem eine gerootete Android-Umgebung verwendet wird. Noch mehr, können Sie es nicht vollständig vermeiden.

Dies ist ein Problem, das von allen Anwendungen auf einem Computer außerhalb Ihrer Kontrolle (alle Client-Anwendungen) gemeinsam genutzt wird. Sie können niemals den Daten vertrauen, die von ihnen kommen.

Wie ich es sehe, haben Sie mehrere Möglichkeiten:

  1. den Code Obfuscate und die App erschweren reverse-engineered zu werden. Beachten Sie, dass dies das Problem nicht löst, sondern minimiert.
  2. Verschieben Sie die Verarbeitung zum Server. Je mehr das Spiel vom Server gesteuert wird, desto weniger anfällig ist Ihre App für dieses bösartige Verhalten.
  3. automatisch unmöglich Noten erkennen und ihre Konten

Beifall zu schließen,

+0

Ich glaube nicht, dass es leicht gefälscht werden kann. Sie müssen ihren SHA1-Schlüssel registrieren, um Google Play Games verwenden zu können. Es scheint, dass sie sehen können, ob die App die Originalversion oder eine Raubkopieversion ist. – Z0q

+0

Ich meine nicht mit anderen Anwendungen im Telefon. Ich meine von anderen HTTP-Client-Anwendung fälschen die ursprüngliche Anfrage, und Wissen über den Quellcode und Sniffing der HTTP-Konversation der ursprünglichen App kann getan werden. Ich bearbeite meine Antwort, um auf einen verwurzelten Android – idelvall

1

Wenn Sie die Signatur Ihrer App, ohne die Möglichkeit zu überprüfen, ob dieser auch geknackt wird, würde man die ganze apk laden müssen und machen Sie die Überprüfung auf einem Server. Dies ist keine praktikable Lösung.

Die einzige sichere Android-App ist eine reine Terminal-App, was bedeutet, dass Sie alle Computer auf einem Server erledigen müssen. Meistens wird dies wegen der Latenz nicht möglich sein.

Deshalb müssen wir Android-Entwickler damit leben: Eine App ist nicht 100% sicher.

Aber Sie können sich nähern.

Sie möchten vielleicht Security with HTTPS and SSL Leitfaden für die Sicherung Ihrer Kommunikation lesen.

Auch möchten Sie Ihren Client, um sicherzustellen, ist schwer zu knacken: Wenn Sie ein Spiel mit einem Server haben: android app piracy prevention und Combating Android App Piracy: Xposed

In Ihrem Fall werden Sie auch serverseitige Anforderungsüberprüfung implementieren möchten Seite, Benutzer haben wahrscheinlich ein Konto. Wenn ein Benutzer ein eindeutig unmögliches Ergebnis sendet, ignoriert er automatisch die Anfrage und verbietet den Benutzer (und seine IP). (Aber denken Sie auch daran, dass dies niemals mit einer gültigen Anfrage geschehen sollte, sonst könnten Benutzer wütend werden und aufhören zu spielen.)

2

1) Verwenden Sie code obfuscation für ex. Proguard. Diese Art von Tools ist nicht nur für Java verfügbar. Aber seien Sie vorsichtig damit - verschleierter Code kann langsam arbeiten oder zusätzliche Fehler enthalten.

2) hinzufügen App Licencing Check (dies wird App Signatur mit Google Play) überprüfen:

Dieses Video sehen mit Aufmerksamkeit: https://www.youtube.com/watch?v=TnSNCXR9fbY Wie ich erinnere er Technik zur Laufzeit verwendet erwähnen Ihre überprüfen App nicht gehackt oder geändert (zip überprüfen, etc).

3) Stellen Sie sicher, dass Ihre App/Server eine sichere Verbindung (SSL/TLS) nur mit MODERN Cipher Suites verwendet. Dies verringert Downgrade-Angriffe.

können Sie diesen Generator verwenden Config mit modernen Chiffriersätze für Ihren Server zu bauen: https://mozilla.github.io/server-side-tls/ssl-config-generator/

Auch können Sie Zertifikat auf Clientseite pining verwenden - dies wird Autorität Angriff abzuschwächen.

Verwenden Sie keine einfache HTTP-Verbindung.

4) Verwenden Sie eine Art von Anfrage Unterzeichnung (wie Amazon AWS tut) Sie Kernidee von ihrem docs bekommen. http://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html

Auch this article sollte hilfreich sein.

5) Verbieten Sie die Verwendung Ihrer App auf ROOT 'Ed-Geräte durch Hinzufügen von Laufzeit überprüfen. Durch das Telefon mit Root-Funktion ist es einfacher, Ihre App zu hacken oder zu analysieren.

6) Sie können Betrug verringern, indem Sie Ihrem Online-Spiel ein Sperrsystem hinzufügen - wenn jemand Ihre App hackt und falsche Daten an Ihren Server sendet => diesen Benutzer zur Sperrliste auf der Serverseite hinzufügen (per IP oder Benutzer-ID) , etc).Wahrscheinlich hinzufügen Benutzer zu dieser Liste vorübergehend (ex 24 Stunden, 7 Tage)

7) + Wenn Sie Json/XML als Datenformate für Netzwerkebene verwenden, versuchen Sie, Binärformat wie Protocol Buffers zu verwenden. Binäre Serialisierung Formate effizienter und schwer zu Reverse Engineering.

+0

zu verweisen. Stimme stark mit # 5 nicht überein. – WhoIsJohnDoe

+0

@WhoIsJohnDoe Bitte beschreiben Sie, warum Sie so denken? – dasar

+0

Es gibt mehr als genug gültige Anwendungsfälle zum Rooten Ihres Geräts. Ich verstehe die Logik dahinter, aber ich bin immer noch nicht einverstanden mit der Sperrung eines Teils Ihrer Benutzerdatenbank, nur weil es "einfacher" ist. – WhoIsJohnDoe

1

Sie können Ihren Code besser verschleiern und ein sehr verschleiertes Geheimnis verwenden, um Ihre Anfragen zu signieren. Damit können Sie die Sicherheit erhöhen.

Aber wenn all dein Spiel im Client läuft, kann es nicht vollkommen sicher sein. Da es nicht wichtig ist, was Sie zum Signieren verwenden, bedeutet dies, dass Sie im Client den geheimen oder privaten Schlüssel haben und dann gehackt werden können.

Um es sicherer zu machen, müssen Sie einige Spiellogik in Server einbeziehen und dann in dieser Logik steuern, dass der Benutzer nicht betrügt.