77 votes

Est-ce que le jeton_authenticable de Google est sécurisé?

Je suis en train de construire une api simple avec Rails de l'API, et veulent s'assurer que je suis sur la bonne voie. Je suis l'aide de concevoir pour gérer les connexions, et a décidé d'aller avec Concevoir l' token_authenticatable option, ce qui génère une clé API que vous devez envoyer à chaque requête.

Je suis d'appariement de l'API avec un backbone/marionnette avant la fin et je suis généralement demandais comment je dois gérer les sessions. Ma première pensée a été de stocker la clé de l'api dans le local de stockage ou d'un cookie, et de les récupérer au chargement de la page, mais quelque chose à propos de l'enregistrement de la clé api de cette façon m'a dérangé à partir d'un point de vue sécurité. Ne pas être faciles à saisir la clé de l'api, soit par la recherche dans le local de stockage/le cookie ou renifler toute demande qui va de travers, et l'utiliser pour usurper l'identité de cet utilisateur indéfiniment? Je suis actuellement la réinitialisation de la clé api de chaque connexion, mais même cela semble souvent - tout le temps de vous connecter sur n'importe quel appareil, cela signifie que vous serais connecté sur tous les autres, qui est une sorte de douleur. Si j'ai pu laisser tomber ce reset, je se sentir comme il permettrait d'améliorer à partir d'un point de vue de l'utilisabilité.

Je suis peut-être totalement faux (et j'espère que je suis), quelqu'un peut-il expliquer si l'authentification de cette façon, de manière fiable, sécurisé, et si pas ce qu'est une bonne alternative serait? Dans l'ensemble, je suis à la recherche d'une façon de me garder en toute sécurité les utilisateurs "signé" pour accéder à l'API souvent sans forcer re-auth.

187voto

Ashitaka Points 8105

token_authenticatable est vulnérable à des attaques temporelles, qui sont très bien expliqué dans cet article de blog. Ces attaques ont été la raison en token_authenticatable a été retiré de Concevoir 3.1. Voir la plataformatec blog pour plus d'info.

Pour avoir le plus d'émission de jeton de sécurité mécanisme d'authentification, le jeton:

  1. Doivent être envoyées via le protocole HTTPS.

  2. Doit être d'une robustesse cryptographique d'un temps aléatoire jeton.

  3. Doit être soigneusement comparé.

  4. Ne doivent pas être stockés directement dans la base de données. Seulement un hachage du jeton peut y être stockées. (Rappelez-vous, token = mot de passe. Nous ne stockons pas les mots de passe en clair dans la base de données, non?)

  5. Doit avoir une date d'expiration.

Si vous renoncez à certains de ces points en faveur de l'utilisation, vous finirez avec un mécanisme qui n'est pas aussi sécurisée que possible. C'est aussi simple que cela. Vous devez être assez prudent si vous remplissez les trois premières conditions, et restreindre l'accès à votre base de données si.

L'expansion et à expliquer ma réponse:

  1. Utiliser le protocole HTTPS. C'est certainement le point le plus important parce qu'il traite avec renifleurs.

    Si vous n'utilisez pas le protocole HTTPS, alors beaucoup de choses peuvent mal se passer. Par exemple:

  2. Générer le jeton à l'aide d' SecureRandom.hex.

  3. Trouver l'enregistrement de l'utilisateur à l'aide de l'id de l'utilisateur, e-mail ou ce que vous avez. Ensuite, comparez jeton de l'utilisateur avec la demande de jeton Devise.secure_compare(user.auth_token, params[:auth_token].

    Ne pas trouver les enregistrements d'utilisateurs avec des Rails finder comme User.find_by_auth_token(params[:auth_token]). Ce est vulnérable à des attaques temporelles!

  4. Si vous allez avoir plusieurs applications/sessions en même temps par l'utilisateur, alors vous avez deux options:

    • Stocker en clair le jeton dans la base de données de sorte qu'il peut être partagé entre les appareils. C'est une mauvaise pratique, mais je suppose que vous pouvez le faire au nom de UX (et si vous faites confiance à vos employés DB access).

    • Stocker autant de chiffrées de jetons par l'utilisateur que vous souhaitez autoriser les sessions en cours. Donc, si vous voulez permettre à 2 séances sur 2 appareils différents, garder 2 distinctes jeton de hachages dans la base de données. Cette option est un peu moins simple à mettre en œuvre, mais il est certainement plus sûr. Il a aussi l'avantage de vous permettre d'offrir à vos utilisateurs la possibilité à la fin de l'actuelle session est active dans des dispositifs spécifiques en révoquant leur jetons (tout comme GitHub et Facebook n').

  5. Le jeton doit avoir une date d'expiration. Si vous êtes inquiet au sujet de UX, puis vient à expiration le jeton tous les 14 jours ou tous les mois. Il suffit de ne pas la rendre permanente. Permanent des jetons sont comme des mots de passe, vous ne pouvez pas changer. Par l'ajout d'une date d'expiration pour vos jetons, vous pouvez limiter le temps d'un attaquant de l'abus de cas de vol d'un jeton. Comme référence, Google jetons d'accès ont une durée de vie de 14 jours. Facebook et Linkedin ont une durée de vie de 60 jours.

  6. Mise à niveau de Rails 4 pour utiliser son cookie crypté magasin. Si vous ne pouvez pas, alors chiffrer la banque de cookies vous-même, comme suggéré ici. Il n'y aurait absolument aucun problème en matière de stockage d'un jeton d'authentification dans un cookie crypté magasin.

Vous devez également avoir un plan d'urgence, par exemple, une tâche rake pour réinitialiser un sous-ensemble de jetons ou de chaque jeton dans la base de données.

Pour commencer, vous pouvez vérifier ce gist (par l'un des auteurs de Concevoir) sur la façon de mettre en œuvre sécurisée des jetons d'authentification à Concevoir. Enfin, la Railscast sur la sécurisation d'un API devrait être utile.

3voto

Gaurav Sharma Points 414

Vous pouvez essayer d'utiliser rails4 avec votre API, c'est plus de sécurité et l'utilisation de concevoir 3.1.0 rc

Pour le jeton de session magasin, vous pouvez aller à travers les http://ruby.railstutorial.org/chapters/sign-in-sign-out et http://blog.bigbinary.com/2013/03/19/cookies-on-rails.html pour plus d'understable.

Enfin, vous devez passer par ce genre de cryptage et de décryptage "Incapable de déchiffrer stockées des données chiffrées" pour obtenir le plus de sécurité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X