2012-07-26 19 views
40
InApp Billing tut

Eigentlich ist das ein wenig albern über die öffentlichen Schlüssel schützen (was die Definition des öffentlichen Schlüssels ist dann?), Aber nach dem documentation by Google:So schützt Google Public-Key-Spiele, wenn

zu halten Ihr öffentlicher Schlüssel ist vor böswilligen Benutzern und Hackern geschützt. Fügen Sie ihn nicht in einen Code als literale Zeichenfolge ein. Konstruieren Sie stattdessen die Zeichenfolge zur Laufzeit aus Stücken oder verwenden Sie die Bit-Manipulation (z. B. XOR mit einer anderen Zeichenfolge), um den eigentlichen Schlüssel auszublenden. Der Schlüssel selbst ist nicht geheime Informationen, aber Sie wollen es nicht einfach für einen Hacker oder böswilligen Benutzer, den öffentlichen Schlüssel mit einem anderen Schlüssel zu ersetzen.

Gibt es einen empfohlenen Weg?

Ich weiß, es gibt viele Möglichkeiten, es zu tun, ich will einfach nicht auf die gleiche Weise folgen, wie die Menschen Passwort umgehen in der Vergangenheit Hashing (zB MD5, SHA1, etc.), möchte ich die beste Praxis kennen im obigen Anwendungsfall.

Antwort

35

Dies kommt viel hier rüber :) Die Idee hinter dem Absatz, den Sie zitieren, ist, dass für die In-App-Abrechnung, um sicher zu sein, Sie Transaktionssignaturen überprüfen müssen. Diese sind mit einem privaten Schlüssel signiert, der mit Ihrem Entwicklerkonto verknüpft ist. Der Schlüssel befindet sich auf den Servern von Google. Daher kann davon ausgegangen werden, dass niemand sonst Daten signieren kann. Um dies zu überprüfen, benötigen Sie Ihren öffentlichen Schlüssel, den Sie von der Entwicklerkonsole kopieren können. Wenn jemand es in Ihrer App ersetzt, könnten sie es täuschen, In-App-Abrechnung Transaktionen aus nicht autorisierten Quellen zu akzeptieren, denn wenn sie den öffentlichen Schlüssel einpflanzen, steuern sie wahrscheinlich auch den entsprechenden privaten Schlüssel. In der Praxis ist es jedoch viel einfacher, den Code einfach an den richtigen Stellen zu ändern, damit er für isLicensed(), hasItem() oder ähnliche Methoden, die Sie haben könnten, immer true zurückgibt, und niemand tut dies.

Der beste Weg, um den Schlüssel zu schützen, ist natürlich, den Schlüssel in Ihrer App überhaupt nicht zu haben. Verschieben Sie die gesamte Transaktionsvalidierungslogik auf Ihren Server, und verwenden Sie HTTPS, um eine Verbindung zu ihr herzustellen. Überprüfen Sie die Zertifikatskette ordnungsgemäß, um sicherzustellen, dass Sie mit Ihren eigenen Servern sprechen. Andernfalls könnte jemand mit DNS herumalbern und Ihre App täuschen, um sich mit ihren eigenen Servern zu verbinden. Ein ähnlicher Angriff gegen den Kauf von iOS wurde vor ein paar Wochen angekündigt.

Die nächste beste Sache ist, den Schlüssel irgendwie zu verschleiern, und es in Ihrer APP eingeschlossen zu haben.Dies hat den Vorteil, dass Sie keinen Server benötigen, aber der Nachteil ist, dass wenn jemand bestimmt genug ist, werden sie es herausfinden, da sie immer den Byte-Code Ihrer App umkehren können. Also ist es am besten, wenn Sie Ihre eigene originelle Methode entwickeln, die nicht in öffentlichen Foren angezeigt wird :) Um es ein bisschen schwieriger zu machen, können Sie den Validierungsteil in nativem Code implementieren, der schwieriger ist (aber nicht unmöglich) zu analysieren. Wie oben erwähnt, ist das Patchen von Byte-Code an den richtigen Stellen jedoch viel einfacher als der Versuch, den öffentlichen Schlüssel zu ersetzen, so dass die meisten Cracker es tun.

+1

Was meinen Sie "In der Praxis ist es jedoch viel einfacher, Ihren Code an den richtigen Stellen einfach zu ändern, um immer für isLicensed(), hasItem() oder ähnliche Methoden haben Sie vielleicht und niemand tut das. "? Dieser Satz ergibt keinen vollständigen Sinn. Bitte klären Sie. – Stunner

+10

Es bedeutet, dass es einfacher ist, die App zu patchen und eventuell vorhandene Lizenzprüfungen zu deaktivieren, anstatt zu versuchen, den Schlüssel zu ersetzen. –

+0

~ "** kontrollieren wahrscheinlich auch den entsprechenden privaten Schlüssel **". In-App-Abrechnungsanforderungen werden jedoch über die Play Store-APK auf dem Gerät ausgeführt. Wie also könnte jemand diese Logik kontrollieren oder manipulieren? –

4

Speichern Sie Ihren öffentlichen Schlüssel in der Server-Seite und sobald Sie eine Antwort von Google Play erhalten, um den Schlüssel zu überprüfen, senden Sie diese Antwort an den Server und führen Sie Ihre Operation dort auf dem Server.

+1

Das setzt voraus, dass eine solche serverseitige Infrastruktur eingerichtet ist. –

32

Machen Sie zumindest einfache Textumwandlung. Die Idee ist, dass die Dex Disassemblierung nicht Ihren öffentlichen Schlüssel offenbaren wird.

Hier ist Beispiel für Funktion, die einfache String-Codierung/Decodierung macht:

/** 
* Simple String transformation by XOR-ing all characters by value. 
*/ 
static String stringTransform(String s, int i) { 
    char[] chars = s.toCharArray(); 
    for(int j = 0; j<chars.length; j++) 
     chars[j] = (char)(chars[j]^i); 
    return String.valueOf(chars); 
} 

dann Ihre private Schlüssel wird in der Quelle als codierte Zeichenfolge gespeichert (kodieren sie mit dieser Funktion), und zur Laufzeit mit der gleichen Funktion decodiert. Dies ist eine Art "XOR" -Methode von Google vorgeschlagen.

Sie machen den 'i' Parameter selbst, alles Zufall wie 0x27 oder andere funktionieren. Wenn Sie auf diese Weise mehr Zeichenfolgen ausblenden, verwenden Sie für jede Transformation ein anderes 'i'.

+14

Mystery :) Wenn Sie Programmierer sind, überwinden Sie sicherlich ein solches Problem. –

+2

@NPike, müssen Sie die Zeichenfolge zu entkommen, um es in Java zu verwenden. Probieren Sie diese Website: http://www.htmlscape.net/javaescape_tool.html Leider stellte ich fest, dass der Transformationsprozess oft zu einer Zeichenkette führte, mit der Eclipse nicht umgehen konnte (selbst wenn es maskiert wurde), also müssen Sie zwicken Der Wert wird XORed, bis Sie etwas bekommen, was Sie verwenden können ... –

11

Alternativ zum manuellen Verschleiern des Schlüssels können Sie einen Obfuscator auch automatisch ausführen lassen. ProGuard ist Teil des Android SDK, verschleiert aber meistens Klassen-/Feld-/Methodennamen, keine Zeichenfolgen. Sein spezialisiertes Geschwister für Android, DexGuard, kann weitere Ebenen der Verschleierung hinzufügen, String-Verschlüsselung, Klassenverschlüsselung und Reflexion anwenden. Es ist nicht kostenlos, aber es spart Zeit und es ist wahrscheinlich effektiver, als es manuell zu tun.

(Ich bin der Entwickler von ProGuard und DexGuard)

+0

genial !! Danke .. XOR-Methode ist gesichert ?? –

+1

Ist DexGuard kein Overkill, um nur eine einfache Zeichenfolge zu verschleiern? Ich meine, was ist die Garantie dafür, dass es trotzdem richtig gemacht wird? –

1

Der öffentliche Schlüssel ist Base64-kodiert ([a-zA-Z0-9+/]), so können Sie bequem die Notwendigkeit vermeiden, dass die verschleierten String überhaupt zu entkommen, wie ein ärgerliches Problem ist in @ PointerNull der Lösung.

Stattdessen können Sie die Verschleierung durchführen, indem Sie zuerst das betreffende Zeichen in einen 6-Bit-Int konvertieren. Dann mache die Bit-Manipulation (z. B. XOR-ing) und wandle dann zurück in ein base64-codiertes Zeichen um. Garantiert, dass kein Charakter entkommen kann.

Verwandte Themen