J'ai lu de très nombreux articles sur la façon dont "vous stockez probablement des mots de passe incorrects". Ils font toujours référence au stockage de mots de passe sur un serveur auquel un utilisateur se connecte; ils refont essentiellement (jeu de mots) des conseils omniprésents comme assurez-vous de saler les mots de passe, etc. etc. Cependant, je n'ai jamais vu un article sur les meilleures pratiques pour stocker les mots de passe sur un client afin que le client n'ait pas à se connecter manuellement chaque fois qu'ils veulent se connecter; la fonction "se souvenir de moi".
De nombreux logiciels ont cette fonctionnalité, des navigateurs aux programmes comme Dropbox.
J'ai lu récemment un ancien article sur la façon dont Dropbox stockait un ID sur votre ordinateur que vous pouviez simplement copier / coller sur un autre ordinateur et démarrer Dropbox et être connecté en tant que périphérique pour lequel vous avez obtenu l'ID; pas de connexion, rien, et un accès complet au compte Dropbox. Cela semble être une conception vraiment stupide, mais je ne peux pas penser à une meilleure façon de le faire.
Je ne sais même pas comment éviter de stocker quelque chose comme un cookie en texte brut. Si vous le cryptez, où stockez-vous la clé pour la décrypter?
La seule façon que je vois de ne pas introduire de vulnérabilités de sécurité consiste à supprimer la fonctionnalité de connexion automatique et à obliger l'utilisateur à taper son mot de passe chaque fois qu'il souhaite utiliser un service, mais c'est une difficulté d'utilisation et les utilisateurs sont gâtés de s'attendre à ne pas avoir à le faire.
Que puis-je lire sur le stockage local des informations d'identification en toute sécurité pour implémenter la fonction de connexion automatique? Si les principes sont trop simples pour un article entier, quels sont-ils? Le logiciel en question ne devrait pas dépendre de fonctionnalités qui ne sont pas présentes sur toutes les plateformes (comme le "trousseau" de certaines distributions Linux).
Réponses:
Une façon est:
Selon le cadre que vous utilisez pour développer votre site, ce comportement peut être disponible en tant que fonctionnalité intégrée.
Notez que, comme le protocole HTTP est de toute façon sans état, il n'y a en fait aucune différence fonctionnelle entre garder une personne connectée pendant une seule session d'utilisation du site Web et «connexion automatique» la prochaine fois qu'ils utiliseront le site; il s'agit uniquement du temps dont vous disposez avant l'expiration de la session.
Mise à jour: Utilisez également HTTPS pour une sécurité accrue, évidemment.
Mise à jour 2: Notez que cette approche a des limites, en ce qu'elle ne fonctionne pas bien pour les utilisateurs qui changent beaucoup leur adresse IP. Cependant, il offre un niveau de sécurité accru et peut être utile dans certaines situations.
la source
Amazon (et bien d'autres) utilise une approche hybride. Ils fournissent une connexion automatique pour la navigation, l'ajout d'articles au panier et la passation de commandes à l'aide de combinaisons d'adresses de crédit / de livraison que vous avez utilisées auparavant. Cependant, ils vous demandent de saisir votre mot de passe pour de nombreuses actions telles que l'ajout de cartes de crédit, l'ajout / la modification d'adresses de livraison, la mise à jour des mots de passe, la visualisation des commandes passées (facultativement pour l'utilisateur) et de nombreux autres paramètres de compte.
Alors oui, les gens qui ont accès à votre ordinateur peuvent détourner votre session, mais vous obtenez toujours ce qu'ils commandent! (Plus important encore, l'incitation à détourner une session est à peu près annulée.) Mais si quelqu'un a accès à mon ordinateur, j'ai plus de problèmes que les gens qui volent la moyenne des sessions de site.
Si certaines parties de votre application ne nécessitent pas un niveau de sécurité aussi élevé, vous pouvez choisir un modèle hybride dans lequel vous stockez un ID de session (haché ou autre si vous le souhaitez) pour connecter automatiquement les utilisateurs aux parties à faible sécurité du site. , mais les obliger à entrer le mot de passe lors de l'entrée dans les zones de sécurité supérieure et à supprimer le jeton de haute sécurité à la fin de la session.
Bien sûr, s'il s'agit d'un site de niveau bancaire, la connexion automatique n'est pas une option. Encore une fois, les sites qui utilisent ces types de sécurité supposent que la valeur des données qu'ils protègent et la commodité supplémentaire pour l'utilisateur l'emportent sur le risque potentiel d'une session piratée. Si vous pensez que ce n'est pas le cas pour votre application, n'implémentez pas les connexions automatiques. Vous devez accéder au niveau de compromis sécurité / convivialité approprié à votre cas d'utilisation.
la source
Ce n'est en fait pas si difficile. Enregistrez d'abord un cookie avec ce format:
Vous pouvez utiliser un hachage sha1 pour le jeton. Ensuite, dans votre table de base de données Remember_me_tokens, stockez l'ID utilisateur, un hachage bcrypt du jeton et l'heure de génération du jeton.
Ensuite, lorsque quelqu'un visite votre site, vérifiez si le cookie est défini. Si le cookie est défini, vérifiez s'il existe une ligne valide dans la base de données au cours des 7 derniers jours, par exemple. S'il y a une ligne valide dans la base de données pour le cookie, définissez la session pour indiquer que l'utilisateur est connecté et supprimez également la ligne de cookie / base de données correspondante et générez une nouvelle ligne de cookie / jeton / base de données.
S'ils se déconnectent, supprimez le cookie.
Exécutez une tâche cron pour élaguer Remember_me_tokens qui sont plus anciennes que disons 7 jours.
la source
Vous ne pouvez le faire que si vous faites confiance à l'appareil sur lequel vous le stockez. Il appartient à l'utilisateur (si vous ne pouvez pas influencer l'appareil) de sa sécurité. C'est tout simplement hors de vos mains.
Comme indiqué dans les commentaires:
la source