J'ai lu beaucoup de documents et de code qui valideront en théorie un reçu intégré à l'application et / ou au bundle.
Étant donné que ma connaissance du SSL, des certificats, du cryptage, etc. est quasiment nulle, toutes les explications que j'ai lues, comme celle-ci prometteuse , m'ont été difficiles à comprendre.
Ils disent que les explications sont incomplètes parce que chaque personne doit comprendre comment le faire, ou les pirates auront un travail facile pour créer une application de piratage qui peut reconnaître et identifier les modèles et patcher l'application. OK, je suis d'accord avec cela jusqu'à un certain point. Je pense qu'ils pourraient expliquer complètement comment faire et mettre un avertissement disant "modifier cette méthode", "modifier cette autre méthode", "obscurcir cette variable", "changer le nom de ceci et cela", etc.
Une bonne âme peut-elle être assez gentille pour expliquer comment valider LOCALEMENT, regrouper les reçus et les reçus d'achat intégrés sur iOS 7, car j'ai cinq ans (d'accord, faites-en 3), de haut en bas, clairement?
Merci!!!
Si vous avez une version fonctionnant sur vos applications et que vous craignez que les pirates voient comment vous l'avez fait, changez simplement vos méthodes sensibles avant de publier ici. Obfusquez les chaînes, changez l'ordre des lignes, changez la façon dont vous faites des boucles (de l'utilisation de for à l'énumération de bloc et vice-versa) et des choses comme ça. Évidemment, chaque personne qui utilise le code qui peut être affiché ici, doit faire la même chose, pour ne pas risquer d'être facilement piratée.
la source
Réponses:
Voici une procédure pas à pas de la façon dont j'ai résolu ce problème dans ma bibliothèque d'achat intégré RMStore . Je vais vous expliquer comment vérifier une transaction, ce qui comprend la vérification de l'ensemble du reçu.
En un coup d'oeil
Obtenez le reçu et vérifiez la transaction. En cas d'échec, actualisez le reçu et réessayez. Cela rend le processus de vérification asynchrone car l'actualisation de la réception est asynchrone.
À partir de RMStoreAppReceiptVerifier :
Obtenir les données de reçu
Le reçu est dans
[[NSBundle mainBundle] appStoreReceiptURL]
et est en fait un conteneur PCKS7. Je suis nul en cryptographie, alors j'ai utilisé OpenSSL pour ouvrir ce conteneur. D'autres l'ont apparemment fait uniquement avec des cadres système .Ajouter OpenSSL à votre projet n'est pas anodin. Le wiki RMStore devrait vous aider.
Si vous choisissez d'utiliser OpenSSL pour ouvrir le conteneur PKCS7, votre code pourrait ressembler à ceci. De RMAppReceipt :
Nous entrerons dans les détails de la vérification plus tard.
Obtenir les champs de réception
Le reçu est exprimé au format ASN1. Il contient des informations générales, certains champs à des fins de vérification (nous y reviendrons plus tard) et des informations spécifiques sur chaque achat via l'application applicable.
Encore une fois, OpenSSL vient à la rescousse lorsqu'il s'agit de lire ASN1. À partir de RMAppReceipt , en utilisant quelques méthodes d'assistance:
Obtenir les achats intégrés
Chaque achat intégré est également en ASN1. L'analyse est très similaire à l'analyse des informations générales de réception.
À partir de RMAppReceipt , en utilisant les mêmes méthodes d'assistance:
Il est à noter que certains achats intégrés, tels que les consommables et les abonnements non renouvelables, n'apparaîtront qu'une seule fois sur le reçu. Vous devez les vérifier juste après l'achat (encore une fois, RMStore vous aide avec cela).
Vérification en un coup d'œil
Maintenant, nous avons tous les champs du reçu et tous ses achats intégrés. Nous vérifions d'abord le reçu lui-même, puis nous vérifions simplement si le reçu contient le produit de la transaction.
Voici la méthode que nous avons rappelée au début. Depuis RMStoreAppReceiptVerificator :
Vérification du reçu
La vérification du reçu lui-même se résume à:
Les 5 étapes du code de haut niveau, à partir de RMStoreAppReceiptVerificator :
Explorons les étapes 2 et 5.
Vérification de la signature du reçu
À l'époque où nous avons extrait les données, nous avons jeté un coup d'œil sur la vérification de la signature du reçu. Le reçu est signé avec le certificat racine Apple Inc., qui peut être téléchargé à partir de l' autorité de certification racine Apple . Le code suivant prend le conteneur PKCS7 et le certificat racine en tant que données et vérifie s'ils correspondent:
Cela a été fait au début, avant que le reçu ne soit analysé.
Vérification du hachage du reçu
Le hachage inclus dans le reçu est un SHA1 de l'identifiant de l'appareil, une valeur opaque incluse dans le reçu et l'identifiant du bundle.
C'est ainsi que vous vérifieriez le hachage du reçu sur iOS. De RMAppReceipt :
Et c'est l'essentiel. Il me manque peut-être quelque chose ici ou là, alors je reviendrai peut-être sur ce post plus tard. Dans tous les cas, je recommande de parcourir le code complet pour plus de détails.
la source
Je suis surpris que personne n'ait mentionné Receigen ici. C'est un outil qui génère automatiquement un code de validation de reçu obscurci, différent à chaque fois; il prend en charge les opérations GUI et en ligne de commande. Hautement recommandé.
(Non affilié à Receigen, juste un utilisateur heureux.)
J'utilise un Rakefile comme celui-ci pour relancer automatiquement Receigen (car cela doit être fait à chaque changement de version) lorsque je tape
rake receigen
:la source
Ceci est une version Swift 4 pour la validation du reçu d'achat in-app ...
Permet de créer une énumération pour représenter les erreurs possibles de la validation du reçu
Créons ensuite la fonction qui valide le reçu, elle lèvera une erreur s'il ne parvient pas à le valider.
Utilisons cette fonction d'aide pour obtenir la date d'expiration d'un produit spécifique. La fonction reçoit une réponse JSON et un identifiant de produit. La réponse JSON peut contenir plusieurs informations de reçu pour différents produits, afin d'obtenir les dernières informations pour le paramètre spécifié.
Vous pouvez maintenant appeler cette fonction et gérer les cas d'erreur possibles
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
J'espère que cela aidera pour tous ceux qui le souhaitent dans une version rapide.
la source