41 votes

Code de validation du ticket de caisse du Mac App Store ?

Je me demande si quelqu'un a un tutoriel ou un code fonctionnel pour la validation des reçus du nouvel App Store de Mac ? Les seules références que j'ai pu trouver jusqu'à présent sont l'excellente documentation d'Apple sur le sujet et un projet open source qui compile mais qui n'a pas beaucoup de commentaires en ligne et qui est donc difficile à comprendre à moins d'être un as de la cryptographie.

Documentation Apple pour les développeurs enregistrés seulement :

https://developer.apple.com/devcenter/mac/documents/validating.html

ValidateStoreReceipt de Roddi (semble prometteur, mais peu documenté) :

https://github.com/roddi/ValidateStoreReceipt

Je me demande également pourquoi Apple ne fournit pas simplement un code de travail pour la validation ?

Y a-t-il d'autres bonnes références ?

8 votes

La raison pour laquelle Apple ne fournit pas le code complet est que si tout le monde utilisait le même code, toutes les applications seraient aussi faciles à craquer. Si tout le monde le fait de manière légèrement différente, cela est censé compliquer la tâche des pirates.

0 votes

Prime pour quiconque expliquera cela suffisamment bien pour que je puisse le faire fonctionner. J'ai notamment essayé d'utiliser le code d'Alan Quartermain et j'ai rencontré des erreurs de compilation voir mon commentaire sous la réponse de Koregan.

6 votes

@Nick Je pense que 99% des développeurs ne se soucient pas des hackers, s'ils veulent pirater votre application ils le feront. Je veux juste m'assurer que si un utilisateur normal copie mon application depuis l'ordinateur de son ami, elle ne fonctionnera pas.

31voto

Laurent Etiemble Points 17360

Il est difficile de fournir une solution générique pour la validation des reçus du Mac App Store, principalement parce qu'il s'agit d'un élément de code très sensible qui doit être difficile à contourner (cf. Documentation Apple ).

Ces projets GitHub sont de très bons points de départ pour connaître les étapes à suivre pour la validation des reçus :

Une fois que vous avez compris ce qu'il faut faire, voici quelques conseils :

  • N'utilisez pas de classes ou de méthodes Objective-C. Objective-C transporte beaucoup de métadonnées, et sa nature dynamique les expose à l'injection au moment de l'exécution.
  • N'utilisez que des appels de fonctions C. Même si vous avez besoin de plus de lignes de code avec le framework CoreFoundation, vous pouvez parfaitement faire ce que le framework Foundation peut faire (NSString, NSArray, NSDictionary, ...).
  • Ne pas établir de lien dynamique avec le OpenSSL car elle a été dépréciée dans Mac OS X Lion. Si vous souhaitez utiliser OpenSSL , liez-le statiquement pour être sûr d'avoir la dernière version.
  • Utiliser les fonctions du système pour la cryptographie. Mac OS X est livré avec des fonctions équivalentes depuis la version 10.5. Par exemple, pour calculer un hachage SHA-1, vous pouvez utiliser la fonction CC_SHA1 fonction.
  • Ne mettez pas de chaînes de caractères en clair dans votre code. Encodez-les ou chiffrez-les. Si vous ne le faites pas, vous donnez un indice sur l'emplacement de votre code.
  • N'utilisez pas de constantes numériques dans votre code. Calculez-les au moment de l'exécution, avec des opérations simples (+, -, / ou *). Encore une fois, si vous ne le faites pas, vous donnez un indice sur l'emplacement de votre code.
  • Évitez les tests simples de validation en incorporant vos tests et l'appel à NSApplicationMain en une boucle complexe.
  • Évitez d'appeler directement NSApplicationMain. Utilisez un pointeur de fonction pour masquer l'invocation. Si vous ne le faites pas, vous donnez un indice sur l'emplacement de votre code.
  • Pour chaque version de votre application, modifiez légèrement le code de validation afin qu'il ne soit jamais le même.

N'oubliez pas que la validation des reçus est nécessaire et n'est pas aussi simple qu'il n'y paraît. Elle peut vous faire perdre beaucoup de temps que vous pourriez mieux consacrer à votre application.

Je vous suggère donc de jeter un coup d'œil à cette application : Receigen (Avertissement : je suis le développeur de cette application).

0 votes

Donc tous ces projets qui utilisent du code Obj-C ne sont pas utiles, puisqu'ils sont exposés à l'injection de runtime, au lieu de votre Receigen c'est du pur code C. J'ai une question maintenant, comment vérifier votre application avant de l'acheter ? Vous pouvez comprendre que, en raison de sa nature (générateur de code), il pourrait être utilisé comme une démo avant de l'acheter (je ne vois pas de revue pour vérifier les commentaires des utilisateurs de l'application aussi). Je paierais pour cela, seulement si je pouvais vérifier l'application avant.

0 votes

Vous avez un bon point. Je ne sais toujours pas comment offrir une version gratuite de Receigen pour que les gens puissent tester la génération de code (doit-il générer seulement une partie du code, ou obfusquer le résultat, ...). Pouvez-vous me dire ce qui serait suffisant pour que vous puissiez évaluer l'application ?

0 votes

@LaurentEtiemble Ce post est utile lorsqu'il s'agit de vendre à partir de l'App Store, mais pouvez-vous m'aider à comprendre comment protéger une application que je vends à partir de mon propre site web (c'est-à-dire le téléchargement d'un fichier zip) ? security.stackexchange.com/questions/21226/

6voto

snibbe Points 1194

Afin de valider par rapport au reçu réel après le test, modifiez cette ligne de code dans votre fichier main.m fichier :

if (!validateReceiptAtPath(@"~/Desktop/receipt"))

à

#ifdef USE_SAMPLE_RECEIPT   // defined for debug version
    NSString *pathToReceipt = @"~/Desktop/receipt";
#else
    NSString *pathToReceipt = [[[NSBundle mainBundle] bundlePath]
        stringByAppendingPathComponent:@"Contents/_MASReceipt/receipt"];
#endif  
    if (!validateReceiptAtPath(pathToReceipt))
        exit(173); //receipt did not validate

et dans les paramètres de votre compilateur, "Other C Flags" pour votre configuration de débogage devrait inclure -DUSE_SAMPLE_RECEIPT

courtoisie de http://jesusagora.org/groups/futurebasic/0::53562:get:1read.html

4 votes

D'où vient le reçu de débogage/test ?

6 votes

Sur Lion et les versions supérieures, utilisez [[[NSBundle mainBundle] appStoreReceiptURL] path] au lieu de coder en dur le chemin de réception.

6voto

koregan Points 6156

Vérifiez bien que vous validez un reçu pour votre application. Il est facile de faire toute la cryptographie et la vérification des signatures pour un mauvais reçu.

Voir http://pastebin.com/1eWf9LCg Il semble qu'Angry Birds n'ait pas respecté ce point et qu'il soit possible de substituer un reçu d'une application gratuite.

Alan Quatermain a également un code pour faire cela sur github. https://github.com/AlanQuatermain/mac-app-store-validation-sample

Il ne doit pas être utilisé tel quel pour éviter une suppression automatique.

0 votes

Après l'avoir téléchargé comment puis-je le faire fonctionner ? Je ne vois pas de .xcodeproj, et gcc main.m m'a donné des erreurs.

0 votes

Pour être plus précis J'ai essayé d'importer ses sources dans mon projet. Mais chaque fois que j'essaie de compiler l'un des fichiers du répertoire asn1, j'obtiens au moins 22000 erreurs de compilation dans AppKit.h. Est-ce qu'il me manque un paramètre quelque part ?

1 votes

L'échantillon a été extrait directement d'une application Cocoa OS X 10.6 ordinaire. Vous pouvez remplacer votre propre fichier main.m par celui-ci et ajouter les autres fichiers dans leur sous-dossier directement et cela devrait fonctionner. Vous aurez besoin de lier Security.framework pour que le trousseau de clés compile, mais autrement il n'aura besoin que des bibliothèques Cocoa IIRC.

4voto

indragie Points 9847

Vous pouvez essayer NPReceiptVerification . C'est le moyen le plus simple d'ajouter la vérification des reçus à votre application. Il vous suffit d'ajouter les fichiers de classe à votre projet, de définir la version et l'identifiant du paquet, et tout le reste est géré automatiquement.

3voto

C0C0AL0C0 Points 107

J'ai examiné le code d'Alan Quartermain et il semble bon. Une chose à laquelle il faut penser :

le dernier paramètre pourrait/devrait être une exigence compilée stipulant que le code doit être signé par VOTRE certificat et celui de personne d'autre.

Lorsque le développeur soumet une application au magasin pour approbation, les certificats de signature sont les suivants :

3rd Party Mac Developer Application: me
Apple Worldwide Developer Relations Certification Authority
Apple Root CA

Une fois l'application livrée de l'App Store à l'utilisateur final, les certificats de signature sont les suivants :

Apple Mac OS Application Signing
Apple Worldwide Developer Relations Certification Authority
Apple Root CA

De plus, je suggère de n'utiliser exit(173) que lorsque le reçu est manquant, mais que tout le reste est en ordre.

0 votes

Je vous recommande vraiment d'effectuer une forme de vérification des certificats, car cela vous protégera contre l'édition du binaire par l'hexagone. OS X ne tue pas une application si sa signature n'est pas valide, il va juste restreindre l'accès à des choses comme le trousseau de clés jusqu'à ce que l'utilisateur accepte un tel accès. Vous pouvez toujours vérifier si le certificat correspond au vôtre ou au certificat officiel qu'Apple utilise pour publier l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X