web-dev-qa-db-fra.com

Stockez le mot de passe localement. Où? Comment le passer en toute sécurité?

Je développe une application. L'utilisateur doit saisir ses informations d'identification qui seront envoyées au serveur. Si l'utilisateur ouvre l'application une deuxième fois, il ne devrait pas avoir besoin de les saisir à nouveau - les informations d'identification doivent être stockées sur la machine de l'utilisateur. Ces données peuvent également être transmises. Mon application est multiplateforme, je recherche donc une solution multiplateforme. Donc, étape par étape, l'algorithme devrait ressembler à ceci:

  1. L'utilisateur entre un identifiant et un mot de passe, et ces données vont au serveur. Comment puis-je le passer en toute sécurité? Dois-je utiliser un protocole sécurisé comme https ou ssl?
  2. Si les informations d'identification sont correctes, je dois enregistrer ces données sur la machine locale. Dois-je utiliser un fichier de base de données local, un fichier binaire ou simplement un fichier texte? Où stocker ce fichier? Et je parie que je dois crypter cela. Je dois également le déchiffrer plus tard, mais pour le déchiffrement, j'ai besoin de données supplémentaires (une clé, probablement), non? Où stocker ces données supplémentaires?
  3. À un moment donné, je dois transmettre ces informations à un autre processus. J'ai déjà une communication TCP entre les processus établis. Est-ce suffisant pour passer? Dois-je le passer crypté ou décrypté.

Veuillez me corriger si mes étapes sont erronées. C'est la première fois que je traite de sécurité donc je manque de connaissances.

15
nikitablack

HTTPS ou un protocole personnalisé utilisant TLS pour le chiffrement est la bonne façon de communiquer en toute sécurité avec un serveur distant, en supposant que vous l'implémentez correctement et quittez si quelque chose ne va pas avec les certificats (j'ai vu des applications mobiles qui, malgré l'utilisation de HTTPS, ont accepté mon certificat auto-signé immédiatement sans même demander à l'utilisateur, ce qui rend la "sécurité" inutile).

Stocker les informations d'identification en toute sécurité sur la machine est beaucoup plus difficile, car si votre application peut les décrypter, les logiciels malveillants peuvent fonctionner avec les mêmes privilèges que votre application - toute protection serait simplement une sécurité par obscurité et n'arrêterait pas un attaquant dédié, cela pourrait ne protège que contre les "voleurs" courants qui sont principalement conçus pour voler des profils de navigateur (historique, cookies de session) ou des fichiers personnels (pour un éventuel vol d'identité) et ne volera pas le binaire de l'application afin que l'attaquant ne sache pas comment les informations d'identification enregistrées ont été chiffrés, ou même s'il a le binaire de l'application, il peut ne pas s'en soucier car la rétro-ingénierie prend du temps et nécessite de l'expérience (notez que les développeurs de logiciels malveillants ne sont souvent pas ceux qui les déploient et collectent/revendent les données volées).

Vous pouvez dériver une clé du matériel comme pbkdf2(sha512(OSname+OSversion+CPUmodel+MACaddress)) et l'utiliser comme clé pour crypter les informations d'identification, qui peuvent être récupérées sur la même machine mais ne bénéficieront à un attaquant que s'il a seulement volé les informations d'identification cryptées et le binaire de l'application, sauf s'il a toujours accès à la machine pour revenir en arrière et obtenir la même valeur

Il n'est pas nécessaire d'utiliser le chiffrement pour la communication interprocessus sur la même machine, si un attaquant peut intercepter cette communication qu'il a déjà le contrôle de la machine (au même niveau de privilège que l'application utilise, sinon plus), ce qui signifie que vous pouvez lire ce que j'ai dit ci-dessus à propos de ne pas pouvoir se défendre contre cela.

10
user42178

L'utilisateur entre un identifiant et un mot de passe, et ces données vont au serveur. Comment puis-je le passer en toute sécurité? Dois-je utiliser un protocole sécurisé comme https ou ssl?

Oui! Vous devez transmettre les données de manière sécurisée, en utilisant TLS par exemple.

Si les informations d'identification sont correctes, je dois enregistrer ces données sur la machine locale. Dois-je utiliser un fichier de base de données local, un fichier binaire ou simplement un fichier texte? Où stocker ce fichier? Et je parie que je dois crypter cela. Je dois également le déchiffrer plus tard, mais pour le déchiffrement, j'ai besoin de données supplémentaires (une clé, probablement), non? Où stocker ces données supplémentaires?

Vous pouvez générer une clé au lieu du mot de passe, donc par exemple, dans l'authentification, le serveur renvoie une CLÉ (bits aléatoires) enregistrez-la dans une base de données avec l'ID de l'utilisateur, et vous stockez cette CLÉ localement, mais sur le serveur vous savoir à qui cela appartient. Ensuite, lors de la deuxième connexion, vous envoyez cette clé au serveur, qui vérifie si elle est valide (appartient à cet utilisateur) et non expirée.

À un moment donné, je dois transmettre ces informations à un autre processus. J'ai déjà une communication TCP entre les processus établis. Est-ce suffisant pour passer? Dois-je le passer crypté ou décrypté.

Encore une fois, vous ne passez que la clé. Vous pouvez crypter, mais il est vraiment difficile d'éviter tous les types d'attaques que votre système peut subir.

12
G4spr