Je développe une application qui se connecte à une API basée sur XML. J'ai le contrôle sur le serveur et l'application - est-ce que je peux vous assurer que ma seule application peut accéder à l'API?
Il n'y a pas d'authentification de l'utilisateur. P>
EDIT: P> < P> La principale préoccupation est que les bots volent des données en balayant le XML. P>
Comment sur ceci: P>
Je demande une session avec le périphérique UDID et je reçois une clé de main. p> à partir de cette chaîne Un mot de passe est calculé sur le serveur et le client selon un algorithme convenu (il doit simplement être difficile à reconstruire) p> Disons-nous maintenant que j'ajoute 1 à la touche de main de la poignée de main p> sur tous les appels d'API, je passe ensuite ce mot de passe avec l'UDID. Cela permettrait au serveur de limiter chaque session à un certain nombre d'appels, non? P> Que pensez-vous? P> P>
5 Réponses :
Vous pouvez fournir un mécanisme de réponse rapide pour défi, en supposant que vous ayez un contrôle sur l'API XML.
générer un numéro et l'inclure dans votre application et du côté serveur. Utilisez cela comme une graine à Srand () sur le client et le serveur. P>
Demandez à la demande du client incluent quelque chose comme: p> ID ID signifie Le nombre aléatoire généré 123'rd généré et 12312931 est la valeur après avoir appelé Rand () 123 fois. La valeur 123 devrait être un nombre généré aléatoirement (généré avec une graine différente!). P> Ce n'est pas une réponse du défi de la preuve imbécile, mais c'est simple et efficace, et ne repose pas sur rien Plus qu'un ensemble de bibliothèque BASIC ANSI C. p> Notez que ce n'est pas terriblement sécurisé, soit tout ce qu'il faudrait faire, c'est que votre client défier son propre serveur, puis générer le (dans cet exemple) 123'rd nombre aléatoire pour chaque valeur de semences jusqu'à ce qu'ils soient trouve le. Donc, je n'utiliserais pas cela en attendant qu'il fournisse une authentification de niveau cryptographique ou un contrôle d'accès. Il fournit simplement une réponse simple non triviale qui est efficace et simple à mettre en œuvre. P> p>
Je ne crois pas qu'il y ait une promesse que la séquence renvoyée par Rand () soit la même de la plate-forme à la plate-forme. POSIX ne semble pas définir l'algorithme réel, juste les exigences minimales. Je suppose dans ce qui précède le serveur choisit "123". Si le client le choisit, cela ne fournit aucune sécurité du tout (pas même de sécurité triviale). Si le serveur envoie une pièce d'identité, il y a des pauses plus rapides que de calculer toutes les valeurs des graines de 64k. Le plus évident consiste à mimer la session. Je peux également trouver la graine beaucoup plus rapidement en contenant le client avec ID = 1, puis id = 2 pour les quelques collisions.
Accédez à votre service Web via HTTPS avec authentification. P>
Oui mais comment? Essayer de comprendre cela sur iPhone. Quelles classes utilisez-vous pour cela?
Non, il n'est pas possible de vraiment vous assurer que seule votre application peut contacter votre serveur. Il existe des techniques d'obscurcissement pour élever quelque peu la barre des attaquants et ceux-ci travailleront pour la plupart des attaquants. Votre problème sous-jacent n'est pas satisfait pour un attaquant dédié. Vous pouvez trouver une liste d'autres messages sur ce sujet à iPhone: Comment chiffrer une chaîne . Il existe plusieurs techniques que vous pouvez utiliser dans ces postes et quelques discussions sur la manière dont vous devriez attaquer les problèmes sous-jacents. P>
Vous pouvez utiliser une sorte de signature afin de vérifier qu'il s'agit bien de votre application qui appelle l'appel, vous calculez la signature côté serveur et de l'application, uniquement si elles correspondent au retour du service avec une réponse à la demande. Typiquement, les signatures sont composées de certains paramètres de paramètres de votre fonction suivi d'une clé secrète, puis prenez le hachage de la MD5 de cela et de le sauter. Dans l'étant Equest, personne ne sera capable de trouver la clé secrète car elle se trouve dans le hachage MD5. P>
Malheureusement, la clé secrète doit ensuite être codée dans votre programme, que vous devez alors donner aux utilisateurs. Un attaquant renverra l'ingénieur la clé secrète de l'exécutable (ou de la mémoire dans un débogueur) et l'utilisera ensuite pour se connecter au serveur. Ou il modifiera votre programme pour faire ce qu'il souhaite, et laissera votre programme gérer la poignée de main secrète pour lui. C'est une forme d'obscurcissement, mais cela ne résoudra pas le problème si vous avez une sorte d'attaquant dédié.
Je pense que la vraie question que vous devez poser est la quantité de vos données à risque d'attaque. Je dirais 99% du temps que vous serez bien avec une URL obscurposée qui sera difficile à deviner, car les chances de l'utilisateur moyen essayant de faire quoi que ce soit avec elle en dehors de votre application sont minces. Si vous êtes inquiet pour les concurrents vous volant de vous, je suggérerais quelque chose d'un peu plus néfaste: p>
Dans votre application, configurez-le de sorte que votre application et votre serveur modifient les URL de temps en temps, peut-être toutes les deux semaines. Ensuite, si quelqu'un tente d'accéder à votre API XML, ils vont combattre une bataille constante de déterminer vos URL. Et comme glaçage sur le gâteau, gardez les anciennes URL actives mais faites-leur de retourner de mauvaises données. Je pense que vous pouvez laisser votre imagination courir et comprendre le reste d'ici. P>
Comment l'application détermine-t-elle quelle sera l'URL correcte? Quelle que soit la technique qu'il utilise peut être dupliquée par quiconque inversez les ingénieurs l'application. De même, simplement renifler le trafic de l'application légitime indiquera à l'application Rogue où se connecter. Cette solution est compliquée à mettre en œuvre sans avoir un impact sur les utilisateurs légitimes (qui peut avoir des problèmes lors de chaque transition), mais est une autre version d'un secret partagé, sauf que ce secret n'est même pas crypté sur le fil (puisque l'URL ne peut pas être) .
Ce n'est pas une réponse utile car elle ne répond pas du tout à leur question. De plus, vous ne fournissez aucun mécanisme réel pour faire ce que vous suggérez.