2016-05-06 1 views
1

Nous construisons une application Android et l'une de ses caractéristiques est de réserver une cabine de fournisseur de services de taxi (par exemple un Uber).Comment vous assurer que seul l'utilisateur autorisé peut accéder à une fonctionnalité fournie par le serveur?

Nous avons un ID utilisateur spécifique à l'application. Appelons-le AUID. Pour réserver la cabine, l'application affichera une demande au serveur et enverra AUID avec d'autres informations pertinentes (comme lat, long etc). Comment puis-je m'assurer à la fin du serveur que la requête provient bien du bon utilisateur et qu'il est possible de réserver le taxi en toute sécurité? Dans le formulaire actuel, si un tiers apprend à connaître l'AUID d'une autre personne, le tiers peut réserver un taxi au nom de cette personne.

L'une des solutions auxquelles je pensais était l'utilisation du chiffrement asymétrique. L'application contiendrait la clé publique et le serveur contiendrait la clé privée. Au lieu d'envoyer l'ID utilisateur au serveur, nous envoyons à la place une clé cryptée où la clé serait AUID + horodatée cryptée à l'aide de la clé publique. Nous décrypterons ensuite le message en utilisant la clé privée à la fin du serveur pour obtenir l'AUID. Si l'horodatage du serveur ne se trouve pas dans un certain intervalle du timestamp envoyé par le client, nous rejetons la demande.

Est-ce une approche suffisamment sûre? Existe-t-il d'autres pratiques largement suivies pour de tels scénarios?

+0

vous ne pouvez pas contrôler le client. Si quelqu'un veut assez ce type d'utilisateur, il peut rooter le téléphone et lancer un débogueur contre votre application. utiliser https. essayez un peu d'obscurcissement. c'est le meilleur que vous pouvez faire –

Répondre

1

Ce que vous proposez est sensé: crypter l'AUID sur l'application cliente et vérifier sur le serveur. Comme le suggèrent les commentaires, SSL est vital. Le problème est que si comment crypter l'AUID dans votre application, il peut être compris par toute personne suffisamment dédiée.

Vous pouvez réduire considérablement les risques de fausses demandes en émettant une clé de chiffrement distincte pour chaque utilisateur. Cela signifie que si quelqu'un cracks votre code, ils peuvent toujours seulement usurper à partir d'un compte. Cependant, une fois qu'un intrus a décompilé votre application, il peut théoriquement démarrer de nouveaux comptes, obtenir une clé de chiffrement valide et usurper des requêtes. Ce dont vous avez besoin pour 100% de fiabilité, c'est une forme d'authentification qui n'est pas stockée dans l'application client - comme un mot de passe ou TouchID sur iOS ou une empreinte digitale sur Android M. Ainsi, lorsqu'un utilisateur commande un taxi, il doit entrez une information que vous encodez avec l'AUID et vérifiez sur le serveur. Ces informations secrètes ne sont pas stockées dans votre application, donc personne ne peut simuler des demandes.

Exiger un mot de passe d'un utilisateur est assez incommode. La numérisation d'empreintes digitales est beaucoup plus facile et probablement acceptable. Vous pouvez également utiliser un système de confiance - si l'utilisateur a commandé des taxis auparavant et que tout était OK, ils peuvent commander sans authentification spéciale. L'utilisation de Trust avec des clés de chiffrement individuelles est très efficace, car toute personne essayant d'usurper des requêtes aurait besoin de faire une commande réussie avant de pouvoir usurper - ce qui est probablement trop fastidieux pour elle.