API RESTful sécurisée qui peut être utilisée par L'application Web (angular), iOS et Android

je dois établir un plan pour développer une API RESTful (Python/Flask) qui pourrait être utilisée par notre future application web (Angularjs) et applications mobiles (iOS/Android).

je fais des recherches depuis trois jours et j'ai rencontré plusieurs scénarios: L'utilisation de HTTPS est un moyen en plus des méthodes ci-dessous pour le garder plus sûr. Mais https est plus lent, ce qui pourrait signifier que nous avons besoin de serveurs plus rapides et plus chers.

  1. en utilisant Basic-Http-Auth et en envoyant nom d'utilisateur / mot de passe en clair (encore https)pour chaque requête à L'API.
  2. utilisation de Digest-Auth, qui est un hachage du mot de passe et le suivi serait automatique cela fonctionnerait pour l'application web, mais je n'ai pas été en mesure de confirmer si iPhones et Android supporterait nativement. S'ils le font, cela pourrait être une solution facile!
  3. en utilisant un en-tête http personnalisé, où j'enverrais une chaîne D'Auth personnalisée dans l'en-tête http après une authentification réussie. Mais puis-je m'assurer que je suis l'envoi de cette code d'auth pour chaque requête que l'utilisateur fait. Cela fait exactement comme 1) avec la différence que les mots de passe simples ne sont pas utilisés et le code d'auteur peut expirer sans aucun risque. Le suivi du code d'autorisation, qui n'est plus automatisé comme en 2)
  4. utiliser OAuth est une option. Mais il est assez difficile à mettre en place. S'il n'y a pas de meilleur moyen, c'est peut-être le seul moyen?
  5. sécurisation de L'API comme Amazon S3 comme décrit dans ce grande l'article. En bref, il dit que le serveur et le client sait d'une clé privée, qu'ils pourraient utiliser pour hacher la communication. Ce sera comme une poignée de main de gangster, que tu ne feras confiance au livreur que s'il connaît la poignée de main de gangster. Plus loin dans les commentaires quelqu'un demande:

Comment garder la clé privée "sécurisée" dans une application HTML5 pure ?

vous avez exactement raison; dans une application HTML5 pure (JS/CSS/HTML) , il n'y a pas de protection clé. Vous feriez toutes les communications par HTTPS dans ce cas, vous n'auriez pas besoin de clé puisque vous pourriez en toute sécurité identifier un client à L'aide D'un API_KEY standard ou d'un autre identificateur sans la nécessité ou la complexité d'un CCMH.

donc en d'autres termes, il n'y a même pas de raison d'utiliser la méthode pour une application web en premier lieu. Et honnêtement, je ne comprends pas comment cela doit fonctionner sur l'appareil mobile. Un utilisateur télécharge notre application et comment dois-je envoyer la clé privée à partir de l'iphone pour le serveur? Dès que je l'aurai transféré, il sera compromis.

plus je fais des recherches, plus je suis indécis.

j'espérais demander à des professionnels qui ont déjà fait cela et qui pourraient partager leur expérience. Merci Beaucoup

33
demandé sur Houman 2013-05-06 18:05:21

3 réponses

vous semblez confondre deux concepts différents. Nous commençons à parler de chiffrement du trafic (HTTPS), puis nous commençons à parler de différentes façons de gérer les sessions authentifiées. Dans une application sécurisée ce ne sont pas mutuellement exclusives tâches. Il semble également y avoir un malentendu potentiel sur la façon dont la gestion de session peut avoir un impact sur l'authentification. Sur cette base, je fournirai une introduction sur la gestion des sessions d'applications web/api web, l'authentification, et cryptage.

Introduction

Gestion Des Sessions

les transactions HTTP sont apatrides par défaut. HTTP ne spécifie aucune méthode pour informer votre application qu'une requête HTTP a été envoyée par un utilisateur spécifique (authentifié ou non).

pour les applications web robustes, ceci n'est pas acceptable. Nous avons besoin d'un moyen d'associer les demandes et les données faites à travers les demandes multiples. Pour ce faire, sur demande initiale au serveur un utilisateur doit être assignée une"session". Généralement, les séances ont une sorte d'identifiant unique qui est envoyé au client. Le client envoie cet id de session avec chaque requête et le serveur utilise l'id de session envoyé dans chaque requête pour préparer correctement une réponse pour l'utilisateur.

il est important de se rappeler qu'un 'ID de session' peut être appelé beaucoup d'autres choses. En voici quelques exemples: jeton de session, jeton, etc. Pour plus de cohérence, j'utiliserai 'session id' pour le reste de ceci réponse.

chaque requête HTTP du client doit inclure l'id de session; ceci peut être fait de plusieurs façons. Voici des exemples populaires:

  1. il peut être stocké dans un cookie - les cookies pour le domaine courant sont automatiquement envoyés sur chaque demande.
  2. il peut être envoyé sur L'URL - chaque requête peut envoyer l'id de session sur L'URL, non suggéré puisque les ID de session resteront dans l'historique des clients
  3. il peut être envoyé via un en-tête HTTP - chaque demande doit spécifier l'en-tête

la plupart des applications Web utilisent des cookies. Toutefois, les applications qui utilisent JavaScript et les conceptions de page unique peuvent choisir D'utiliser un en-tête HTTP/le stocker dans un autre endroit qui est observable par le serveur.

il est très important de se rappeler que la réponse HTTP qui informe le client de son ID de session et les requêtes du client qui contiennent l'id de session sont complètement en texte clair et 100% dangereuses. De battez cela, tout le trafic HTTP doit être crypté; C'est là que HTTPS entre en jeu.

il est également important de souligner que nous n'avons pas parlé de relier une session à un utilisateur spécifique dans notre système. La gestion de Session consiste simplement à associer des données à un client spécifique accédant à notre système. Le client peut être à la fois dans les États authentifiés et non authentifiés, mais dans les deux états ils ont généralement une session.

Authentification

l'Authentification est où nous lions une session à un utilisateur spécifique dans notre système. Cela est généralement géré par un processus de connexion où un utilisateur fournit des informations d'identification, ces informations d'identification sont vérifiées, et ensuite nous lions une session à un enregistrement utilisateur spécifique dans notre système.

l'utilisateur est à son tour associé à des privilèges pour le contrôle d'accès à grain fin via des listes de contrôle d'accès et des entrées de contrôle d'accès (ACL et ACE). C'est généralement dénommée "Autorisation". La plupart des systèmes ont toujours les deux authentification et de l'Autorisation. Dans certains systèmes simples, tous les utilisateurs authentifiés sont égaux, auquel cas vous n'aurez pas d'autorisation après l'authentification simple. Il n'est pas possible d'obtenir de plus amples renseignements à ce sujet, mais il est possible de lire des articles sur L'ACE/ACL.

Une session spécifique peut être marqué comme représentant un utilisateur authentifié de différentes manières.

  1. leurs données de session stockées côté serveur pourrait stocker leur ID utilisateur / un autre drapeau qui indique que l'utilisation est authentifié comme utilisateur spécifique
  2. un autre jeton utilisateur pourrait être envoyé au client tout comme un id de session (qui sur HTTP non crypté est tout aussi dangereux que l'envoi d'un id de session non crypté)

L'une ou l'autre option est très bien. Il s'agit généralement de la technologie dans laquelle vous travaillez et de ce qu'ils offrent par défaut.

un client amorce généralement le processus d'authentification. Ceci peut être fait en envoyant des informations d'identification à une url spécifique (par exemple yoursite.com/api/login). Cependant, si nous voulons être "reposants", nous ferons généralement référence à une ressource par un nom et ferons l'action de "créer". Cela pourrait être fait en exigeant un poste de vérification des pouvoirs pour yoursite.com/api/authenticatedSession/. Où l'idée serait de créer une session authentifiée. La plupart des sites affichent simplement les informations d'identification vers /api/login ou similaire. Il s'agit d'un écart par rapport aux idéaux" vrais "ou" purs " reposant, mais la plupart des gens trouvent que c'est un concept plus simple que de penser comme "créer une session authentifiée".

de Cryptage

HTTPS est utilisé pour chiffrer le trafic HTTP entre un client et un serveur. Sur un système qui s'appuie sur des utilisateurs authentifiés et non authentifiés, tout le trafic qui s'appuie sur un utilisateur authentifié doit être crypté via HTTPS; il n'y a pas d'alternative.

la raison en est que si vous authentifiez un utilisateur, partagez un secret avec lui (son id de session, etc) et commencez alors à défilé que le secret dans le HTTP simple leur session peut être détourné par des attaques d'homme-dans-le-milieu. Un hacker attendra que le trafic passe par un réseau observé et vole le secret (depuis son texte en clair sur HTTP) et ensuite initier une connexion à votre serveur prétendant être le client d'origine.

une façon pour les gens de combattre cela est d'associer les requêtes d'adresse IP distante à une session authentifiée. Cela est inefficace seul car n'importe quel hacker sera en mesure de spoof leur demande l'adresse IP distante dans leurs fausses demandes et ensuite observer les réponses que votre serveur renvoie. La plupart des gens diront que cela ne vaut même pas la peine d'être mis en œuvre à moins que vous ne traciez des données historiques et que vous ne les utilisiez pour identifier les modèles de connexion d'un utilisateur spécifique (comme Google le fait).

si vous avez besoin de diviser votre site entre les sections HTTP et HTTPS, il est impératif que le trafic HTTP n'envoie pas ou ne reçoive pas l'id de session ou tout autre token utilisé pour gérer l'authentification le statut d'un utilisateur. Il est également important que vous n'envoyiez pas de données sensibles dans les requêtes/réponses non-HTTPs.

la seule façon de sécuriser les données dans les applications web/API est de crypter votre trafic.

Vos Sujets Un Par Un

Base-Http-Auth

  • authentification: YES
  • gestion des sessions: NO
  • cryptage: Non

C'est une méthode d'authentification par ressource web. L'authentification de base authentifie les utilisations par ressource identifiée par URL. Ceci a été le plus couramment implémenté par le serveur Web HTTP Apache avec l'utilisation de .authentification de répertoire/localisation basée sur htaccess. Les justificatifs d'identité doivent être envoyés avec chaque demande; les clients s'en sont généralement acquittés de manière transparente pour les utilisateurs.

l'authentification de Base peut être utilisé par d'autres systèmes comme un mode d'authentification. Cependant, les systèmes qui utilisent Basic-Http-Auth fournissent authentification et gestion de session, Pas La base-Http-Auth elle-même.

  • Ce n'est pas la gestion de session.
  • ce n'est pas du chiffrement; le contenu et les justificatifs d'identité sont presque 100% du texte en clair
  • ceci ne sécurise pas le contenu de la requête/réponse HTTP de L'application.

Digest-Auth

  • authentification: YES
  • gestion des sessions: NO
  • de Cryptage: PAS de

c'est exactement le même que Basic-Http-Auth avec l'ajout d'une digestion simple MD5. On ne devrait pas se fier à cette digestion au lieu d'utiliser le chiffrement.

  • Ce n'est pas la gestion de session.
  • ce n'est pas du cryptage; le digest est facilement cassé
  • ceci ne sécurise pas le contenu du HTTP de L'application les requêtes/réponses.

OAuth

  • authentification: YES
  • gestion des sessions: NO
  • cryptage: Non

OAuth vous permet juste d'avoir un service externe pour valider vos justificatifs d'identité. Après cela, c'est à vous de gérer/travailler avec le résultat de la requête d'authentification à votre fournisseur de réseau.

  • Ce n'est pas la gestion de session.
  • ce n'est pas du cryptage; votre le trafic des sites est encore en texte clair. Le processus d'authentification sera sécurisé en raison des restrictions HTTPS, mais votre application reste vulnérable.
  • ceci ne sécurise pas le contenu de la requête/réponse HTTP de L'application.

Poignée De Main Du Gangster/ en-tête HTTP personnalisé

  • authentification: Oui, potentiellement
  • gestion des sessions: Oui, potentiellement
  • de Cryptage: PAS de

" Custom HTTP header "est un type de" Gangster Handshakes"; en tant que tel, j'utiliserai la même section pour en discuter. La seule différence est qu'un" en-tête HTTP personnalisé " spécifie où sera stocké le hanshake (ID de session, token, toke d'authentification de l'utilisateur, etc.) (c'est-à-dire dans un en-tête HTTP).

il est important de noter que ceux-ci ne précisent pas comment l'authentification sera traitée, ni comment la gestion de session sera traitée. Ils sont essentiellement décrivez comment et où les identifiants de session/les clés d'authentification seront stockés.

L'authentification devra être traitée par votre application ou par l'intermédiaire d'un tiers (par exemple OAuth). La gestion des séances devra également être mise en œuvre. La chose intéressante est que vous pouvez choisir de fusionner les deux si vous le souhaitez.

  • ce n'est pas du chiffrement; le trafic de vos sites est encore du texte. Le processus d'authentification sera sécurisé en raison des restrictions HTTPS si vous utilisez OAuth, mais votre demande est toujours vulnérable.
  • ceci ne sécurise pas le contenu de la requête/réponse HTTP de L'application.

Ce Que Vous Devez Faire

...Je vous suggère fortement de vous assurer que vous comprenez qu'une application web robuste qui est sûr besoin de ce qui suit:

  1. cryptage (HTTPS est à peu près votre seul choix)
  2. Gestion Des Sessions
  3. Authentification / Autorisation

l'Autorisation repose sur l'Authentification. L'authentification repose sur la gestion de la Session et le cryptage permet de s'assurer que la session n'est pas détournée et que les justificatifs d'identité ne sont pas interceptés.

Flacon De Connexion

je pense que vous devriez regarder dans flacon de connexion comme un moyen d'éviter de re-implémenter la roue. Je ne l'ai personnellement jamais utilisé (j'utilise pyramid pour des applications web en python). Cependant, je l'ai vu mentionné avant dans l'application web/python conseils. Il gère à la fois l'authentification et la gestion des sessions. Lancez votre api/application web via HTTPS et vous avez les trois (chiffrement, gestion de Session et authentification de l'utilisateur).

si vous n'utilisez pas / ne pouvez pas utiliser flask-login, préparez-vous à écrire le vôtre, mais faites d'abord des recherches sur la façon de créer des mécanismes d'authentification sécurisés.

Si possible, si vous ne comprenez pas comment rédiger une procédure d'authentification s'il vous plaît ne le tentez pas sans d'abord apprendre comment les pirates utilisent des attaques basées sur des motifs, des attaques de synchronisation, etc.

Merci De Chiffrer Votre Trafic

...passez outre l'idée que vous pouvez éviter D'utiliser HTTPS avec un token "intelligent". Passez outre l'idée que vous devriez éviter D'utiliser HTTPS / encryption parce que" son lent", processus intensif, etc. C'est un processus intensif parce que c'est un algorithme de chiffrement. La nécessité d'assurer la sécurité de vos données d'utilisateur et de votre les données des applications doivent toujours être votre priorité. Vous ne voulez pas passer par l'horreur d'informer vos utilisateurs que leurs données ont été compromises.

66
répondu Andrew Martinez 2013-09-30 15:07:11

https, il est plus lent, mais pas d'un pas. Seule la poignée de main est plus lente. Pour nous le plus gros problème c'est d'entretenir la paire de clés côté serveur-mobiles et les droits. Nous avons également mis en place un condensé de messages. Le problème est qu'il est difficile de configurer correctement la version php-android-ios. Après cela est fait( un paramètre a besoin de modifier ce qui suggère Google aux premiers résultats seulement côté android) le problème sera avec les appareils bas de gamme: à l'utilisation de CPU beaucoup, ralentir sur le décryptage-encrypt processus, beaucoup plus lent que https, surtout quand vous avez besoin de transformer chaîne 10kb (peut prendre plusieurs minutes).

si Je ne transfère pas les données de la Nasa au Hamas, alors je dirais un cryptage très simple sur un HTTP simple: comme inverser les bits ou plus...

1
répondu 2013-05-13 10:49:04

aller avec HTTPS. Il est (marginalement) plus lent, mais la sécurité que vous obtenez à partir de celui-ci pour le temps d'investissement relativement court (l'achat du cert SSL et juste changer vos URLs http en https) en vaut la peine. Sans HTTPS, vous courez le risque que les sessions de vos utilisateurs soient détournées sur des réseaux publics non sécurisés, ce qui est extrêmement facile pour quelqu'un pour le faire.

1
répondu Andrew Theis 2013-05-14 00:17:32