En détail, voici le problème:
Je construis une application Android, qui consomme mon API REST sur le back-end. J'ai besoin de créer une API d'inscription et de connexion pour commencer. Après avoir cherché avec Google pendant un certain temps, j'ai l'impression qu'il n'y a que deux approches que je peux adopter.
- Lors de l'inscription, j'utilise https et j'obtiens les informations d'identification de l'utilisateur; enregistrez-le dans ma base de données contre le nom d'utilisateur (côté serveur). Lors de la connexion, j'utilise à nouveau https et je demande les informations d'identification de l'utilisateur; vérifiez le mot de passe haché sur la base de données et renvoyez-lui un identifiant de session, que je prévois de ne jamais expirer à moins qu'il ne se déconnecte. De plus, tous les autres appels API (GET / POST) que l'utilisateur effectue, seront accompagnés de cet ID de session afin que je puisse vérifier l'utilisateur.
Mais dans l'approche ci-dessus, je suis obligé d'utiliser https pour tout appel d'API, sinon je suis vulnérable à Man in The Middle Attack, c'est-à-dire que si quelqu'un renifle mon identifiant de session, il peut reconstruire des requêtes GET / POST similaires dont je ne voudrais pas. Ai-je raison avec l'hypothèse ci-dessus?
- La deuxième option consiste à suivre le chemin des Amazon Web Services, où j'utilise public / authentification par clé privée. Lorsqu'un utilisateur s'inscrit, j'utilise une API https pour enregistrer ses informations d'identification dans la base de données. À partir de là, j'utilise le mot de passe haché de l'utilisateur comme clé privée. Tout autre appel d'API effectué par l'utilisateur aura un objet blob haché de l'URL de la demande à l'aide de la clé privée de l'utilisateur. Côté serveur, je reconstruis le hachage en utilisant la clé privée enregistrée. Si le hachage est une correspondance, je laisse l'utilisateur faire sa tâche, sinon je le rejette. Dans cette option, je dois utiliser https uniquement pour l'API d'enregistrement. Le REST peut continuer sur http .
Mais ici, l'inconvénient est que je suis obligé d'héberger mon API d'inscription dans un répertoire virtuel distinct (j'utilise IIS et je ne sais pas si je peux héberger les API http et https dans le même répertoire virtuel ). Par conséquent, je suis obligé de développer l'API d'enregistrement dans un fichier de projet distinct. Encore une fois, ai-je raison avec l'hypothèse ci-dessus?
Modifier: J'utilise ASP.NET MVC4 pour créer l'API Web.
La raison pour laquelle je suis réticent à utiliser https pour tous mes appels d'API REST est que je pense que ce n'est pas léger et crée plus de charge utile réseau, ce qui n'est peut-être pas mieux adapté pour une application mobile. Un cryptage / décryptage supplémentaire et une poignée de main supplémentaire requis peuvent affecter davantage la durée de vie de la batterie d'un mobile? Ou n'est-ce pas significatif?
Laquelle des deux approches ci-dessus suggéreriez-vous?
PS: Nous avons opté pour Https partout, et c'était la meilleure décision. Plus d'informations sur mon blog.