Ich habe viele Dokumente und Codes gelesen, die theoretisch eine In-App- und / oder Bundle-Quittung validieren.
Angesichts der Tatsache, dass mein Wissen über SSL, Zertifikate, Verschlüsselung usw. nahezu Null ist, habe ich alle Erklärungen, die ich gelesen habe, wie diese vielversprechende , als schwer verständlich empfunden.
Sie sagen, dass die Erklärungen unvollständig sind, weil jede Person herausfinden muss, wie es geht, oder die Hacker werden es leicht haben, eine Cracker-App zu erstellen, die Muster erkennen und identifizieren und die Anwendung patchen kann. OK, ich stimme dem bis zu einem gewissen Punkt zu. Ich denke, sie könnten vollständig erklären, wie es geht, und eine Warnung mit den Worten "Diese Methode ändern", "Diese andere Methode ändern", "Diese Variable verschleiern", "Den Namen von diesem und jenem ändern" usw. einfügen.
Kann eine gute Seele da draußen so freundlich sein, zu erklären, wie man Quittungen und In-App-Kaufbelege unter iOS 7 LOKAL validiert, bündelt, wenn ich fünf Jahre alt bin (ok, mach es 3), klar von oben nach unten?
Vielen Dank!!!
Wenn Sie eine Version haben, die an Ihren Apps arbeitet, und Sie befürchten, dass Hacker sehen, wie Sie es gemacht haben, ändern Sie einfach Ihre vertraulichen Methoden, bevor Sie hier veröffentlichen. Verschleiern Sie Zeichenfolgen, ändern Sie die Reihenfolge der Zeilen, ändern Sie die Art und Weise, wie Sie Schleifen ausführen (von for bis zum Blockieren der Aufzählung und umgekehrt) und ähnliches. Natürlich muss jede Person, die den hier veröffentlichten Code verwendet, dasselbe tun, um nicht zu riskieren, leicht gehackt zu werden.
Antworten:
Hier ist eine exemplarische Vorgehensweise, wie ich dies in meiner In-App- Kaufbibliothek RMStore gelöst habe . Ich werde erklären, wie eine Transaktion überprüft wird, einschließlich der Überprüfung des gesamten Belegs.
Auf einen Blick
Holen Sie sich die Quittung und überprüfen Sie die Transaktion. Wenn dies fehlschlägt, aktualisieren Sie die Quittung und versuchen Sie es erneut. Dies macht den Überprüfungsprozess asynchron, da das Aktualisieren des Belegs asynchron ist.
Von RMStoreAppReceiptVerifier :
Abrufen der Belegdaten
Die Quittung ist in
[[NSBundle mainBundle] appStoreReceiptURL]
und ist eigentlich ein PCKS7-Container. Ich lutsche an Kryptographie, also habe ich OpenSSL verwendet, um diesen Container zu öffnen. Andere haben es anscheinend nur mit System-Frameworks gemacht .Das Hinzufügen von OpenSSL zu Ihrem Projekt ist nicht trivial. Das RMStore-Wiki sollte helfen.
Wenn Sie OpenSSL zum Öffnen des PKCS7-Containers verwenden, könnte Ihr Code folgendermaßen aussehen. Von RMAppReceipt :
Wir werden später auf die Details der Überprüfung eingehen.
Abrufen der Belegfelder
Die Quittung wird im ASN1-Format ausgedrückt. Es enthält allgemeine Informationen, einige Felder zu Überprüfungszwecken (wir werden später darauf zurückkommen) und spezifische Informationen zu jedem anwendbaren In-App-Kauf.
Auch hier hilft OpenSSL beim Lesen von ASN1. Von RMAppReceipt mit einigen Hilfsmethoden :
In-App-Käufe abrufen
Jeder In-App-Kauf erfolgt ebenfalls in ASN1. Das Parsen ist dem Parsen der allgemeinen Beleginformationen sehr ähnlich.
In RMAppReceipt mit denselben Hilfsmethoden :
Es ist zu beachten, dass bestimmte In-App-Käufe wie Verbrauchsmaterialien und nicht erneuerbare Abonnements nur einmal in der Quittung erscheinen. Sie sollten diese direkt nach dem Kauf überprüfen (auch hier hilft Ihnen RMStore).
Überprüfung auf einen Blick
Jetzt haben wir alle Felder von der Quittung und allen In-App-Käufen erhalten. Zuerst überprüfen wir die Quittung selbst und dann prüfen wir einfach, ob die Quittung das Produkt der Transaktion enthält.
Unten ist die Methode, die wir am Anfang zurückgerufen haben. Von RMStoreAppReceiptVerificator :
Überprüfung der Quittung
Die Überprüfung der Quittung selbst läuft auf Folgendes hinaus:
Die 5 Schritte im Code auf hoher Ebene von RMStoreAppReceiptVerificator :
Lassen Sie uns einen Drilldown in die Schritte 2 und 5 durchführen.
Überprüfung der Quittungssignatur
Als wir die Daten extrahierten, warfen wir einen Blick auf die Bestätigung der Quittungssignatur. Die Quittung ist mit dem Apple Inc.-Stammzertifikat signiert, das von der Apple Root Certificate Authority heruntergeladen werden kann . Der folgende Code verwendet den PKCS7-Container und das Stammzertifikat als Daten und prüft, ob sie übereinstimmen:
Dies wurde zu Beginn durchgeführt, bevor die Quittung analysiert wurde.
Überprüfen des Quittungs-Hash
Der in der Quittung enthaltene Hash ist ein SHA1 der Geräte-ID, ein undurchsichtiger Wert in der Quittung und die Bundle-ID.
Auf diese Weise würden Sie den Beleg-Hash unter iOS überprüfen. Von RMAppReceipt :
Und das ist der Kern davon. Möglicherweise fehlt mir hier oder da etwas, sodass ich später auf diesen Beitrag zurückkommen kann. In jedem Fall empfehle ich, den vollständigen Code nach weiteren Details zu durchsuchen.
quelle
Ich bin überrascht, dass hier niemand Receigen erwähnt hat. Es ist ein Tool, das automatisch einen verschleierten Belegvalidierungscode generiert, der jedes Mal anders ist. Es unterstützt sowohl die GUI als auch den Befehlszeilenbetrieb. Sehr empfehlenswert.
(Nicht mit Receigen verbunden, nur ein glücklicher Benutzer.)
Ich verwende ein solches Rakefile, um Receigen automatisch erneut auszuführen (da dies bei jeder Versionsänderung durchgeführt werden muss), wenn ich Folgendes eingebe
rake receigen
:quelle
Dies ist eine Swift 4- Version zur Validierung des In-App-Kaufbelegs ...
Erstellen Sie eine Aufzählung, um die möglichen Fehler der Belegvalidierung darzustellen
Erstellen wir dann die Funktion, die die Quittung validiert. Sie gibt einen Fehler aus, wenn sie nicht validiert werden kann.
Verwenden Sie diese Hilfsfunktion, um das Ablaufdatum eines bestimmten Produkts abzurufen. Die Funktion erhält eine JSON-Antwort und eine Produkt-ID. Die JSON-Antwort kann mehrere Beleginformationen für verschiedene Produkte enthalten, sodass die letzten Informationen für den angegebenen Parameter abgerufen werden.
Jetzt können Sie diese Funktion aufrufen und die möglichen Fehlerfälle behandeln
Account tab
Do Sign in
Open iTune Connect
Open My App
Open Feature Tab
Open In App Purchase
Click at the right side on 'View Shared Secret'
At the bottom you will get a secrete key
Hoffe, dies wird jedem helfen, der das in einer schnellen Version will.
quelle