Ich verwende Version 3 der In-App-Abrechnungs-API. Ich habe einen einzelnen, verwalteten, nicht verbrauchbaren Artikel. Ich habe diese Funktion noch nicht in meiner App veröffentlicht, daher möchte ich vor dem Kauf über den Inhalt der Kaufnutzlast entscheiden.
Aus "Best Practices für Sicherheit" :
Legen Sie die Entwickler-Payload-Zeichenfolge fest, wenn Sie Kaufanfragen stellen
Mit der In-App-Abrechnungs-API der Version 3 können Sie beim Senden Ihrer Kaufanfrage an Google Play ein Zeichenfolgentoken für Entwickler-Nutzdaten einfügen. In der Regel wird dies verwendet, um ein Zeichenfolgentoken zu übergeben, das diese Kaufanforderung eindeutig identifiziert. Wenn Sie einen Zeichenfolgenwert angeben, gibt Google Play diese Zeichenfolge zusammen mit der Kaufantwort zurück. Wenn Sie anschließend Fragen zu diesem Kauf stellen, gibt Google Play diese Zeichenfolge zusammen mit den Kaufdetails zurück.
Sie sollten ein Zeichenfolgentoken übergeben, mit dem Ihre Anwendung den Benutzer identifizieren kann, der den Kauf getätigt hat, damit Sie später überprüfen können, ob dies ein legitimer Kauf dieses Benutzers ist. Für Verbrauchsartikel können Sie eine zufällig generierte Zeichenfolge verwenden. Für nicht Verbrauchsartikel sollten Sie jedoch eine Zeichenfolge verwenden, die den Benutzer eindeutig identifiziert.
Wenn Sie die Antwort von Google Play zurückerhalten, stellen Sie sicher, dass die Payload-Zeichenfolge des Entwicklers mit dem Token übereinstimmt, das Sie zuvor mit der Kaufanfrage gesendet haben. Als weitere Sicherheitsmaßnahme sollten Sie die Überprüfung auf Ihrem eigenen sicheren Server durchführen.
Zu Recht oder zu Unrecht habe ich beschlossen, keine "weiteren Sicherheitsvorkehrungen" zu treffen, um einen Server für die Kaufüberprüfung einzurichten. Und ich speichere keine eigenen Aufzeichnungen über den Kauf - ich rufe immer die Abrechnungs-API auf. Gibt es wirklich einen Grund für mich, diese Nutzlastüberprüfung durchzuführen? Die Überprüfungs-API selbst überprüft mit Sicherheit die Identität eines Benutzers, bevor ein Artikel als gekauft gemeldet wird. Wenn ein Angreifer ein Gerät (entweder die App oder die Google Play-API) kompromittiert hat, sehe ich keinen Vorteil darin, eine zusätzliche Überprüfung durchzuführen die Identität des Benutzers auf dem Gerät, wo es leicht umgangen werden kann. Oder gibt es einen Grund dafür, an den ich nicht denke?
quelle
Wenn Ihre Anwendung eine eigene Benutzeranmeldung und -identität bereitstellt, die sich von den Google-Konten unterscheidet, mit denen das Telefon verbunden ist, müssen Sie die Nutzdaten des Entwicklers verwenden, um den Kauf an eines Ihrer Konten anzuhängen, die den Kauf getätigt haben. Andernfalls könnte jemand das Konto in Ihrer App wechseln und von gekauften Inhalten profitieren.
z.B
Angenommen, unsere App hat ein Login für BenutzerA und BenutzerB. Und das Android-Google-Konto des Telefons ist X.
Um einen solchen Missbrauch zu vermeiden, binden wir einen Kauf an ein Konto. Im obigen Beispiel setzen wir die Entwicklernutzlast als "BenutzerA", wenn BenutzerA den Kauf tätigt. Wenn sich Benutzer B anmeldet, stimmt die Nutzlast nicht mit dem angemeldeten Benutzer (Benutzer B) überein, und wir ignorieren den Kauf. Daher kann Benutzer B keine Vorteile aus einem von Benutzer A getätigten Kauf ziehen.
quelle
developerPaylod
Es gibt auch einen anderen Ansatz für die Verarbeitung von Nutzdaten für Entwickler. Wie Nikolay Elenkov sagte, ist es zu viel Aufwand, eine Benutzer-ID zu benötigen und zusätzliche Berechtigungen für das Benutzerprofil für Ihre App festzulegen. Dies ist also kein guter Ansatz. Sehen wir uns also an, was Google in der neuesten Version der TrivialDrive-Beispiel-App in In-App Billing v3-Beispielen sagt:
Die zufällige Zeichenfolge ist also keine gute Idee, wenn Sie den gekauften Artikel auf einem anderen Gerät überprüfen möchten. Sie sagen jedoch nicht, dass dies keine gute Idee für die Überprüfung der Kaufantwort ist. Ich würde sagen - verwenden Sie die Entwickler-Nutzdaten nur zur Überprüfung des Kaufs, indem Sie eine zufällige eindeutige Zeichenfolge senden, speichern Sie sie in den Einstellungen / in der Datenbank und überprüfen Sie diese Entwickler-Nutzdaten in der Kaufantwort. Wenn Sie das Inventar (In-App-Käufe) beim Start der Aktivität abfragen möchten, überprüfen Sie nicht die Nutzdaten der Entwickler, da dies auf einem anderen Gerät passieren kann, auf dem diese zufällige eindeutige Zeichenfolge nicht gespeichert ist. So sehe ich das.
quelle
Es hängt davon ab, wie Sie das überprüfen
developerPayload
. Es gibt zwei Szenarien: Remote-Überprüfung (mithilfe des Servers) und lokale Überprüfung (auf dem Gerät).Server
Wenn Sie einen Server zur
developerPayload
Überprüfung verwenden, kann es sich um eine beliebige Zeichenfolge handeln, die sowohl auf dem Gerät als auch auf dem Server leicht berechnet werden kann. Sie sollten in der Lage sein, den Benutzer zu identifizieren, der die Anforderung ausgeführt hat. Unter der Annahme, dass jeder Benutzer das entsprechende hataccountId
,developerPayload
kann das als Kombination mitpurchaseId
(SKU-Name) wie folgt berechnet werden :MD5(purchaseId + accountId)
Gerät
developerPayload
sollte keine Benutzer-E-Mail sein . Ein gutes Beispiel dafür, warum Sie E-Mail nicht als Nutzlast verwenden sollten, ist der Google for Work-Dienst. Benutzer können ihre mit dem Konto verknüpfte E-Mail-Adresse ändern. Die einzige Konstante istaccountId
. In den meisten Fällen sind E-Mails in Ordnung (z. B. sind Google Mail-Adressen derzeit unveränderlich), aber denken Sie daran, sie für die Zukunft zu entwerfen.Möglicherweise verwenden mehrere Benutzer dasselbe Gerät. Sie müssen also unterscheiden können, wer der Eigentümer des Elements ist. Bei der Geräteüberprüfung
developerPayload
handelt es sich um eine Zeichenfolge, die den Benutzer eindeutig identifiziert, z.MD5(purchaseId + accountId)
Fazit
Im Allgemeinen kann das
developerPayload
in beiden Fällen nur das seinaccountId
. Für mich sieht es nach Sicherheit durch Dunkelheit aus . Der MD5 (oder ein anderer Hashing-Algorithmus)purchaseId
ist nur eine Möglichkeit, die Nutzdaten zufälliger zu gestalten, ohne explizit zu zeigen, dass wir die ID des Kontos verwenden. Der Angreifer müsste die App dekompilieren, um zu überprüfen, wie sie berechnet wird. Wenn die App für Sie noch besser verschleiert ist.Die Nutzlast bietet keine Sicherheit . Es kann leicht mit dem "Geräte" -Ansatz gefälscht werden und ohne Aufwand bei der "Server" -Prüfung. Denken Sie daran, die Signaturprüfung mit Ihrem öffentlichen Schlüssel zu implementieren, der in der Google Publisher-Kontokonsole verfügbar ist.
* Ein unverzichtbarer Blog-Beitrag über die Verwendung der Konto-ID anstelle von E-Mail.
quelle
In dem Google IO-Video über IAB v3, das der Autor des Trivial Drive-Beispiels selbst gegeben hat, wurde dies gegen Ende des Videos kurz angesprochen. Dies dient dazu, Wiederholungsangriffe zu verhindern, z. B. wenn der Angreifer den Datenverkehr abhört, das Paket mit einem erfolgreichen Kauf stiehlt und dann versucht, das Paket auf seinem eigenen Gerät wiederzugeben. Wenn Ihre App die Identität des Käufers nicht über die Entwicklungsnutzlast (idealerweise auf Ihrem Server) überprüft, bevor Sie den Premium-Inhalt (idealerweise auch von Ihrem Server) freigeben, ist der Angreifer erfolgreich. Die Signaturüberprüfung kann dies nicht erkennen, da das Paket intakt ist.
Meiner Meinung nach scheint dieser Schutz ideal für Apps mit Online-Konto-Konnektivität wie Clash of Clans zu sein (Nutzlast kommt natürlich herein, da Sie ohnehin Benutzer identifizieren müssen), insbesondere wenn Hacking das Multiplayer-Gameplay mit weitreichenden Effekten außer einem einfachen lokalisierten Fall von Piraterie beeinträchtigt . Im Gegensatz dazu ist dieser Schutz nicht sehr nützlich, wenn clientseitige Hacks auf der apk den Premium-Inhalt bereits entsperren können.
(Wenn der Angreifer versucht, die Nutzdaten zu fälschen, sollte die Signaturüberprüfung fehlschlagen.)
quelle
Ende 2018 Update: Die offizielle Google Play Billing Library macht das absichtlich nicht verfügbar
developerPayload
. Von hier aus :quelle
Ich kämpfte mit diesem. Da ein Google Play-Konto nur eines der "verwalteten" Elemente besitzen kann, aber mehrere Geräte haben kann (ich habe drei), funktioniert der obige Kommentar von jemandem, dass Sie ein "pro Gerät" verkaufen, nicht Sie können es auf das erste Gerät installieren und auf kein anderes ... Wenn Sie ein Premium-Upgrade kaufen, sollte es auf allen Ihren Handys / Tablets funktionieren.
Ich verachte den Gedanken, die E-Mail-Adresse des Benutzers zu erhalten, aber ich habe wirklich keine andere zuverlässige Methode gefunden. Also greife ich zum ersten Konto, das mit "google.com" in der Kontenliste übereinstimmt (yep, eine Berechtigung zum Hinzufügen zu Ihrem Manifest), und hashe es dann sofort, damit es nicht mehr als E-Mail-Adresse verwendet werden kann, sondern eine "eindeutige" Adresse enthält " Zeichen. Das sende ich als Developer Payload. Da die meisten Leute ihr Gerät mit ihrer Google Play-ID aktivieren, gibt es eine gute Chance, dass alle drei Geräte das gleiche Token erhalten (mit dem gleichen Hash-Algorithmus auf jedem Gerät).
Es funktioniert sogar auf KitKat mit mehreren "Benutzern". (Meine Entwickler-ID befindet sich bei einem Benutzer, meine Test-ID bei einem anderen Benutzer und jeder Benutzer in seiner eigenen Sandbox.)
Ich habe es auf sechs Geräten mit insgesamt 3 Benutzern getestet, und die Geräte jedes Benutzers haben denselben Hash zurückgegeben, und die verschiedenen Benutzer haben alle unterschiedliche Hashes, die den Richtlinien entsprechen.
Zu keinem Zeitpunkt speichere ich die E-Mail-Adresse des Benutzers. Sie wird direkt aus dem Code übergeben, um die Kontonamen an die Hash-Funktion zu senden, und nur der Hash wird auf dem Heap gespeichert.
Es gibt wahrscheinlich noch eine bessere Lösung, die die Privatsphäre der Benutzer noch mehr respektiert, aber bisher habe ich sie nicht gefunden. Ich werde eine sehr klare Beschreibung der Verwendung der E-Mail-Adresse des Benutzers in meine Datenschutzrichtlinie aufnehmen, sobald die App veröffentlicht ist.
quelle
Dies reagiert häufig auf eine Produktdefinition (Ihre Anwendung). Zum Beispiel für Abonnements. Kann derselbe Benutzer das Abonnement auf allen Geräten verwenden, über die er verfügt? Wenn die Antwort ja ist. Wir haben die Nutzlast nicht überprüft.
Für Verbrauchsmaterialien. Angenommen, ein Kauf in Ihrer Anwendung ergibt 10 virtuelle Münzen. Kann der Benutzer diese Münzen auf verschiedenen Geräten verwenden? 4 auf einem Gerät und 6 auf einem anderen? Wenn wir nur auf dem Gerät arbeiten möchten, das den Kauf getätigt hat, müssen wir die Nutzdaten beispielsweise mit einer selbst generierten Zeichenfolge überprüfen und lokal speichern.
Basierend auf diesen Fragen müssen wir entscheiden, wie die Nutzlastprüfung implementiert werden soll.
Grüße
Santiago
quelle