Comment sécuriser les API (clé privée) pour les applications mobiles
Je suis en construction d'un service web qui doit être accessible uniquement pour les applications iOS.
Dans l'avenir, je souhaite développer un site web mobile pour faire mon service également disponible pour d'autres systèmes d'exploitation mobiles.
Maintenant, j'ai tout qui fonctionne grâce à une API. mes utilisateurs peuvent s'inscrire, de recherche, de sociétés, de commander des produits de ces entreprises et le suivi de leurs commandes. Il n'est pas encore activé, mais ça fonctionne..
Je suis confronté à un problème majeur: Comment sécuriser cet?
Depuis quelques jours, j'ai arrêté de codage et j'ai été constamment occupé avec la recherche sur le web, StackOverflow et la Sécurité de l'Information pour savoir comment faire cela. J'ai trouvé que la façon dont amazon sécurise leur API serait la meilleure solution pour moi. La façon dont amazon assure le service est expliqué ici. J'ai modifié un peu pour mon service:
- Utilisateur s'enregistre et obtient privée de la clé API + public (identification) clé
- Utilisateur entre des informations d'identification et les robinets "se connecter". Application crée de hachage de l'variables + clé privée. Application envoie des variables + horodatage + hash + clé publique de l'API
- API de recherche de la clé publique dans la base de données, trouve la clé privée appartenant à clé publique (public si la clé est valide). L'API crée ensuite de hachage de la même manière que l'application n'. Si les hachages sont les mêmes, la demande (log dans ce cas) est exécutée.
Cette manière de sécuriser un service fait sens pour moi, et je peux code plus. mais j'ai un problème majeur et je ne peux trouver aucune solution pour elle:
- L'utilisateur obtient un public & privé de la clé API lorsqu'un compte est créé. La clé publique peut être envoyé depuis le serveur vers l'appareil de l'utilisateur, parce que ce n'est pas forcément un secret. Depuis l'API privée clé peut jamais être envoyés sur le fil, comment diable puis-je m'assurer qu'un compte connecté sur l'appareil d'un utilisateur connaît le privé clé API qui est créé sur le serveur?
Quelqu'un sait comment résoudre ce problème?? toute aide serait très appréciée!!
OriginalL'auteur Joris416 | 2013-12-09
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez plus compliquée de votre schéma d'authentification.
Je voudrais suggérer à l'aide d'un protocole très utilisé comme oauth2 pour la sécurité de votre API - http://oauth.net/2/.
Il y a beaucoup de bibliothèques clientes et beaucoup de serveur-côté des plugins qui soutiennent et mettent en œuvre, et le rend facile à intégrer dans votre application.
OriginalL'auteur Rotem Hermon
Voici comment j'ai résolu le même problème et pourquoi je pense que votre problème est différent de celui que vous pensez:
La façon dont Amazon est-il logique, est sécurisée et plus facile à mettre en œuvre que oAuth donc je ne sais pas pourquoi tout le monde suggère de l'utiliser. J'utilise la méthode d'Amazon, qui va comme ceci:
status
actif. Cela nous permet de gérer en fonction des rôles des autorisations sur le serveur (limitation du débit, contrôle d'accès, etc) et de désactiver un compte à tout momentComme je l'ai dit, il n'y a pas moyen de contourner l'envoi du privé jeton pour le client, mais la bonne chose est que vous ne le faites qu'une seule fois et il devrait être sur SSL de toute façon.
Le problème que vous êtes absent est de savoir comment protéger le jeton sur l'appareil lui-même. C'est un autre problème que je n'ai pas vu toutes les solutions pour.
La seule option viable pour ces deux cas sont les suivants:
Une mesure que nous est venu avec pour sécuriser le jeton sur le périphérique est de faire tourner les jetons périodiquement. Ainsi, par exemple, vous avez le jeton soit stockés sur l'appareil pour chaque utilisateur ou codé en dur dans l'application. Chaque si souvent vous avez besoin d'un nouveau jeton pour le périphérique. Si vous avez une codés en dur jeton puis vous mettez à jour l'application avec un nouveau codé en dur jeton et lorsque l'utilisateur des mises à jour via leur app store, ils verront le nouveau jeton automatiquement. Ensuite, vous révoquer tous les jetons de X jours et nécessitent de toute traînards de mise à jour de l'application. L'autre option si chaque client reçoit un jeton unique lors de la connexion/s'inscrire est aussi expire le jeton, puis automatiquement la session la prochaine fois qu'ils utilisent l'application. Lors de la connexion de retour à vous de générer et envoyer un nouveau jeton valide pour X jours.
En fin de compte, ce sont quelques-uns des problèmes qui sont communs et je ne pense pas encore résolu, au moins pour la méthode d'authentification que vous utilisez. Donc, la meilleure chose que vous pouvez vraiment faire est de l'accepter les risques liés à l'envoi et le stockage de la symbolique et de mettre votre énergie à faire de l'API sécurisé.
OriginalL'auteur Bill
Comme Rotem Hermon suggèrent je voudrais mettre en œuvre Oauth2.
Sur le "comment puis-je m'assurer qu'un compte connecté sur l'appareil d'un utilisateur connaît le privé clé API qui est créé sur le serveur?", (à un niveau très abstrait) le serveur confirme que le client connaît la clé privée par le biais d'une signature de calcul de la clé privée.
Un idiot abstraite exemple:
Serveur a la clientèle privée de la clé ("Z")
Le Client a sa clé privée ("Z")
Ils ont tous deux sait aussi leur clé publique ("Y")
Client hachages de la demande de la ressource ("Un") et sa clé privée et publique, à signer la demande avec une fonction comme ceci
signMyRequest(request,publicKey,privateKey)
Dans cet exemple serait
signMyRequest("A","Y","Z")
Clé publique de respecter le rôle de "nom d'utilisateur" et la clé privée de respecter le rôle de "mot de passe". La différence est que vous n'avez pas les transmettre au serveur, AWS juste fait un calcul sur la clé privée. Pour AWS Signature V4 pour plus d'informations:
http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html
Espère que ça aide et de prendre seulement comme un résumé de l'exemple de la fonctionnalité.
Laissant l'authentification et l'autorisation de côté, vous devriez aussi une préoccupation pour la commune de la faiblesse de sécurité telles que l'Injection SQL, XSS, et depuis il est aussi une Application Web et plus de la commune de la faiblesse de sécurité s'applique.
Oh mon mauvais. Eh bien, vous devez l'envoyer en quelque sorte. Même Amazon Web Services de l'envoyer creux de son site web au moins une fois par un canal sécurisé utilisant le protocole SSL. Si vous voulez éviter cela, vous pouvez mettre en œuvre une clé RSA solution sécurisée (mais cher), permettent à l'utilisateur de définir sa clé privée (insécurité, mais facile à mettre en œuvre) ou de l'envoyer en utilisant un autre canal comme le courrier Électronique ou SMS.
ah, donc la règle qu'une clé privée ne doit jamais être envoyé n'importe où n'est pas rigoureuse.. merci! Je vais regarder dans Oauth2 ainsi 😉
Ne doit pas être envoyé à chaque transaction, il doit être envoyé au moins une fois. Je pense que je vais aller pour la dernière option, par l'envoi de la clé privée de l'auge un autre moyen, c'est la recommandation générale donc, au cas où quelqu'un hacks un des développeurs de compte il l'habitude d'avoir sa clé privée. Mais je pense que oauth2 va vous faire économiser beaucoup de temps et d'effort dans ce cas 🙂
OriginalL'auteur Igarr