Je développe une application iPhone avec des services Web. L'application iPhone utilisera GET ou POST pour récupérer des données à partir des services Web tels que http: // www. myserver.com/api/top10songs.json Pour obtenir des données pour les dix meilleures chansons par exemple. p>
Il n'y a pas de compte d'utilisateur et de mot de passe pour l'application iPhone. Quelle est la meilleure pratique pour vous assurer que seule mon application iPhone ait accès à l'API http: // www .myServer.com / API / TOP10SONGS.JON ? L'Uidevice de SDK iPhone SDK n'est pas suffisante car quiconque peut simuler l'ID de périphérique comme paramètre rendant l'appel de l'API en utilisant des navigateurs wget, curl ou Web. P>
L'API Services Web ne sera pas publié. Les données des services Web ne sont pas secrètes et privées, je veux juste éviter les abus, car il existe également des API d'écrire des données sur le serveur telles que le journal d'utilisation. P>
8 Réponses :
Utilisez une forme de Signatures numériques dans votre demande. Bien qu'il soit assez difficile de faire cette preuve complètement désigné (tout comme tout ce qui concerne la sécurité). Ce n'est pas si difficile de l'obtenir "assez bon" pour prévenir la plupart des abus. P>
Bien sûr, cela dépend fortement de la sensibilité des données, si vos transactions de données impliquent un million de transactions en dollars, vous le souhaitez beaucoup plus en sécurité qu'une simple journalisation statistique d'utilisation (si elle est suffisamment rigoureuse pour saboter et elle gagnera Peu de gagner à l'attaquant, sauf le pisse, il est prudent de supposer que les gens ne vont pas déranger ...) p>
Exactement. La valeur des données indiquera la quantité de protection dont vous aurez besoin.
Un moyen très bon marché de faire cela pourrait être d'obtenir le logiciel iPhone pour envoyer des données supplémentaires avec la requête, telle qu'une chaîne de mot de passe longue de sorte que quelqu'un ne puisse pas accéder à l'alimentation. P>
Quelqu'un pourrait inverser l'ingénieur Ce que vous avez fait ou écouter des données envoyées sur le réseau pour découvrir le mot de passe et si les limitations de la bande passante sont la raison de le faire, un mot de passe simple doit être suffisamment bon. p>
Bien sûr, cette méthode a des problèmes et une authentification basée sur le certificat sera réellement sécurisée, bien qu'elle soit plus difficile de coder. P>
Le problème avec la plupart des solutions sinon toutes les solutions ici est qu'ils sont plutôt enclins à rompre une fois que vous avez ajouté des procurations dans le mélange. Si un proxy se connecte à votre site Web, c'est que ça va? Après tout, il le fait probablement donc au nom d'un iPhone quelque part - peut-être en Chine? Et s'il est correct pour un proxy d'imiter un iPhone, comment déterminez-vous quelles impersonnations sont correctes? P>
Un proxy doit envoyer toutes les données au serveur que l'iPhone envoyé au proxy, donc je ne vois pas de problème.
Ce que vous pouvez faire est d'obtenir une clé secrète que vous savez que vous saurez que dans une signature hachée MD5, vous pouvez généralement structurer des signatures comme en tant que tring de vos paramètres une valeur ND et le secret annexé à la fin, puis prenez la MD5 hachage de cela ... Faites-le à la fois dans votre client et votre côté de votre service et correspondez à la chaîne de signature, uniquement si les signatures correspondez-vous, vous obtenez un accès accordé ... Depuis que le secret n'est présent que dans la signature. pour inverser l'ingénieur et la fissure .. p>
Comment cela serait-il difficile à craquer? Vous venez de lire la requête HTTP et de lire la valeur MD5 de votre paramètre?
Eh bien, si vous reniflez la requête HTTP et que vous le renvoyez, tout comme celui-là, vous obtiendrez une réponse, mais personne ne sera capable de générer ses propres demandes car elles ne sauront pas le secret
Pour avoir passé cela, on peut simplement utiliser une certaine sécurité de niveau de transport afin de renifler les données seront cryptées.
Vous pouvez également accueillir le secret du secret +. Envoyez le temps en texte brut avec le hachage au serveur. Le serveur peut vérifier que l'heure est dans une certaine compensation raisonnable à partir de maintenant pour dissuader les attaques de replay. Étant donné que le serveur connaît le secret, il peut vérifier le hachage en hachage le temps secret + envoyé par le client. Pas parfait, mais fournit une certaine protection contre les replays.
La solution la plus sécurisée est probablement une signature numérique sur la demande. Vous pouvez conserver une clé secrète dans l'application iPhone et l'utiliser pour signer les demandes, que vous pouvez ensuite vérifier sur le côté serveur. Cela évite d'envoyer la clé / mot de passe sur le serveur, ce qui permettrait à quelqu'un de la capturer avec un renifleur réseau. P>
Une solution simple peut être simplement d'utiliser HTTPS - Garder le contenu de vos messages en sécurité malgré la présence d'écites d'écoute potentielle est tout le point de HTTPS. Je ne sais pas si vous pouvez faire des certificats auto-signés avec les trucs nsurlconnection standard, mais si vous avez un certificat côté serveur, vous êtes au moins protégé de l'oreille. Et c'est beaucoup moins de code pour vous écrire (en fait, aucun). P>
Je suppose que si vous utilisez HTTPS comme votre seule sécurité, vous êtes potentiellement ouvert à une personne qui devine l'URL. Si c'est une préoccupation, l'ajout de tout type de validation des paramètres au service Web prendra en charge cela. P>
Voici une expansion sur la suggestion de Daniel. P>
avoir un secret partagé que le serveur et le client connaissent. Dire une longue chaîne aléatoire. P>
Ensuite, lorsque le client se connecte, demandez au client de générer une autre chaîne aléatoire, appendez-la à la fin de la chaîne partagée, puis calculez le hachage MD5. P>
Envoyez à la fois la chaîne générée de manière aléatoire et le hachage comme paramètres de la demande. Le serveur connaît la chaîne secrète. Il peut donc générer un hasch de son propre et s'assurer qu'il correspond à celui qu'il a reçu du client. P>
Ce n'est pas complètement sécurisé, car quelqu'un pouvait décompiler votre application pour déterminer la chaîne secrète, mais c'est probablement le meilleur que vous obtiendrez sans beaucoup de travail supplémentaire. P>
Herms, pouvez-vous donner un exemple de la façon dont vous enverriez la demande? D'après ce que je comprends, vous envoyez le MD5 (SecretKey + un autrerandom) sur le réseau? Quelqu'un n'a-t-il pas pu simplement un-md5 qui demande et lisez le Secretkey tout droit?
Il n'y a pas de "UN-MD5" possible car il s'agit d'un algorithme de hachage à sens unique. Le mieux qu'ils puissent faire (sur ce front) est une chaîne de hachage et recherchez une collision (à l'aide de «tables arc-en-ciel»). Mais le hasard plus la clé secrète fait une attaque «table arc-en-ciel» prohibitive.
BBrown est correct. MD5 est un hachage à sens unique, vous n'avez donc pas à vous soucier de quelqu'un le déchiffrer pour comprendre le secret.
Si quelqu'un attrape une combinaison d'une chaîne hash & aléatoire envoyée, ils pourraient simplement utiliser cette paire pour les demandes. Ou je manque quelque chose? EDIT: Je pourrais utiliser l'URL dans le cadre de la chaîne aléatoire. De cette façon, au moins ils ne peuvent pas rejouer aucune demande, seuls ceux qu'ils ont attrapés.
J'ai demandé à un ingénieur de sécurité Apple à ce sujet à la WWDC et il a dit qu'il n'y a pas de moyen inattaquable d'accomplir cela. Le mieux que vous puissiez faire est de ne pas valoir l'effort impliqué. P>
Je lui ai également demandé d'utiliser éventuellement des notifications push comme moyen de le faire et il pensait que c'était une très bonne idée. L'idée de base est que le premier accès déclencherait une notification push dans votre serveur qui serait envoyée à l'iPhone de l'utilisateur. Étant donné que votre application est ouverte, elle appellerait dans l'application Vous pouvez stocker l'UDID après cela et jeter toutes les demandes portant des udids non vérifiés. En ce qui concerne la supposition de la force brute de paramètres nécessaires, vous devez mettre en œuvre un algorithme limitant le taux, quoi qu'il arrive. P> : Didreceiveremotenotification: Code> Méthode et fournit une charge utile de votre choix. Si vous faites cette charge utile une nonce, votre application peut envoyer la nonce sur la demande suivante et vous avez terminé le cercle. P>
Si les notifications push ne sont pas votre truc, alors le seul autre plan d'action que j'ai rencontré qui augmente suffisamment la barre est un échange clé. Regardez l'application CryptoExercise Sample pour savoir comment générer une clé symétrique aléatoire sur l'iPhone et utiliser une clé publique pour la chiffrer et l'envoyer à un autre iPhone. Ce n'est pas parfait, mais utilisé conjointement avec d'autres contre-mesures et que vous avez un espoir de protéger vos actifs.
avoir une sorte de clé qui change toutes les 5 minutes en fonction d'un algorithme qui utilise l'heure actuelle (GMT). Permettez toujours aux deux dernières clés. Ce n'est pas parfait, bien sûr, mais cela maintient la cible en mouvement et vous pouvez le combiner avec d'autres stratégies et tactiques. P>
Je suppose que vous voulez juste dissuader l'utilisation de votre service. Évidemment, vous n'avez pas mis en place votre application pour être sécurisé. P>