Comment un serveur de s'authentifier une application iPhone (le code, pas l'utilisateur)?
Disons que j'ai une solution impliquant une application iPhone qui génère de l'information et envoie cette information à un service web pour le traitement. Il est important que SEULES les demandes à partir d'instances de cette application pour iPhone sont autorisés à traiter (il peut y avoir plusieurs instances de l'application utilisée par de nombreux utilisateurs différents, mais je veux être sûr qu'ils sont tous à l'aide de code en qui j'ai confiance). En d'autres termes je veux être sûr que mon iPhone ne peut pas être (facilement) avec emprunt d'identité par d'autres clients. Comment voulez-vous faire cela?
- Veuillez être plus précis sur ce type de sécurité que vous avez à l'esprit. Voulez-vous pour inhiber les demandes des autres (iPhone) des dispositifs, d'autres applications (sur le même appareil), ou à toute demande de l'arbitraire des appareils.
- Bon point, j'ai changé la question pour en tenir compte. Merci.
Vous devez vous connecter pour publier un commentaire.
Toutes les autres réponses donner des moyens légitimes de fournir certains autres, mais pas parfait, de la sécurité. Vous devez savoir d'avance (puisque personne d'autre n'a été aussi explicite) qu'il est pas possible à fournir en théorie des communications sécurisées telles que votre serveur peut toujours vérifier que le client à l'autre extrémité de l'achat d'une copie de votre application en cours d'exécution sur sanctionné matériel. Vous ne pouvez pas faire cela parce que le matériel de sécurité au niveau d'Apple a construit dans à coup d'une chaîne de confiance (de sorte que cela peut effectivement être possible pour eux), ils ne l'exposez pas à vous.
Votre stratégie devrait donc être l'un des "nombreux obstacles", des grands, des petits, conçu pour contrecarrer les divers degrés de complexité de l'attaque et de la sophistication de l'attaquant. Voir les autres réponses à cette question pour quelques bonnes idées. Combien d'obstacles dont vous avez besoin, et de ce que la sophistication, repose entièrement sur le coût pour vous (sur le plan économique, la confiance, peu importe) d'avoir une attaque a réussi.
Ne considérez également l'idée que si vous pouvez éviter une "reproductible" atteinte à la sécurité, vous êtes mieux. En d'autres termes, si quelqu'un les pauses de votre app/protocole, et les données pour d'autres personnes à faire qui est la même pour chaque copie/instance, alors vous êtes au plus mal, parce que les instructions et les clés peuvent être tout affiché sur le site web quelque part. Si vous pouvez trouver un moyen de faire de chaque copie/client unique, alors vous pouvez l'observer sur le serveur, et au pire, couper connu rompu clients, etc. (C'est dur sur la plate-forme iPhone.)
Une autre possibilité est de demander à l'application pour une certaine partie du contenu de l'application bundle - quelque chose comme octet 59967 de l'application exécutable ou un fichier plist ou xib. En gardant le nom de fichier et la position demandé totalement aléatoire, n'importe qui l'usurpation a pour incorporer une copie de votre application, ce qui le rend très facile de déterminer si elles sont à l'usurpation de votre application, et peut-être très facile à google pour les événements.
Vous fondamentalement juste d'avoir le client vous donner un numéro de version, et sur le serveur vous d'avoir des copies de tous les fichiers de toutes les versions publiques pour vérifier les réponses contre (et pour décider de ce défi à envoyer).
Comme il est impossible d'empêcher cela, la meilleure chose à faire est de faire de la détection de la mystification aussi facile pour le balayage des que possible et donc j'avais penser à des solutions qui vous aident à n cet égard, plutôt que d'essayer de bloquer le unblockable (même si certains trivial blocage initial gardera le riff-raff).
En gros, plus de couches plutôt qu'une vraiment dur de la couche sont ce que vous voulez dans la sécurisation de quelque chose.
J'ai posé une question similaire, à un moment de retour:
La restriction de l'accès au serveur d'application pour iPhone
Ce que j'ai fini par faire, c'est à l'aide d'un généré de façon aléatoire de l'utilisateur (GUID). J'ai ensuite prendre le nom d'utilisateur, ajouter un secret (codée en dur dans mon application, en miroir sur le serveur), et SHA1 le résultat, et d'envoyer le mot de passe.
Sur le serveur, je prends le nom d'utilisateur donné, ajouter le même secret, de hachage, et le comparer à ce que le client a envoyé. Notez que cela doit être envoyé sur SSL à être même à distance sécurisé.
Une autre approche serait d'envoyer un certificat client SSL avec votre app bundle et configurer votre serveur pour accepter uniquement les connexions de clients avec ce certificat.
La faiblesse de ces deux est que si votre application est fissuré, il est trivial pour extraire le secret ou le client cert.
Si votre préoccupation est non-payant pour les clients utilisant les ressources de votre serveur, vous avez un tout autre problème, car alors votre principale menace modèle est bootleg des copies de votre application en cours d'exécution sur les téléphones jailbreakés. Voir les réponses à mes question des contre-mesures.
strings
sur la décrypté .ipa" vous avez raison. Mais une fois que quelqu'un a décrypté votre .l'iap, l'application peut être considéré comme compromis et tous les paris sont éteints.Sortants de communication générées par votre application peut être intercepté et relus plus tard. Si l'on voulait être sûr qu'une demande est à venir à partir de votre application, vous pouvez faire des choses comme embed public (non privé) les clés de votre application et l'utiliser pour vous connecter à votre communication. Toutefois, dans une situation comme celle-ci, les clés privées et publiques de ne pas faire n'importe quoi sauf la non-répudiation (c'est à dire, prouver que seul le destinataire peut lire le message, parce qu'ils sont le seul avec le correspondant de la moitié de la paire de clés).
Ce que vous cherchez est de fournir de l'authenticité. Vous pourriez faire quelque chose comme effectuer un échange de clés DIFFIE - ( http://en.wikipedia.org/wiki/Diffie-Hellman_key_exchange ) pour générer un secret partagé (depuis par le codage en dur des un secret dans votre application ne permet pas de s'assurer que c'est un secret), puis en utilisant le secret pour effectuer une manipulation spécifique sur votre message (même si ce n'est toujours pas parfaite authenticité).
Ou vous pourriez faire quelque chose comme inspecter votre application de signature de code et vérifier que c'est une signature appropriée et qu'il est de votre application, ou quelque chose de similaire.
Peut-être Graham Lee pop up et de donner une meilleure réponse. 🙂
MODIFIER
(en pensant à haute voix) Voici une idée: une Fois que votre application est sur le store, vous pouvez extraire le code de la signature de la publier app, le mettre sur votre serveur, et de l'utiliser dans un défi-réponse. Lorsque votre client se connecte au serveur, le serveur peut générer une valeur aléatoire et l'envoyer de nouveau. Le client peut manipuler cette valeur à l'aide de l'application intégrée dans le code de la signature, et le retour de la manipulés valeur. Pendant ce temps, votre serveur peut être faire la même chose. Lorsque le serveur reçoit les manipulés de la valeur, on pourrait le comparer à sa version et ensuite de mettre fin, de continuer la connexion sur la base qu'elles correspondent. Techniquement, cela pourrait encore être usurpée (une autre application pourrait voler la signature de code et l'utiliser elle-même), mais il semble que ce serait plus sûr.
Utiliser l'Identifiant de votre Appareil... Envoyer l'Id de l'Appareil avec la demande... chaque iphone aura IDENTIFIANT unique de l'Appareil