web-dev-qa-db-fra.com

Comment implémenter un "souvenir de moi" sur une application mobile?

Je voudrais mettre en œuvre une fonctionnalité de type auto-login automatique à temps limitée sur une application mobile (sur Android). Pour démarrer l'application, l'utilisateur doit taper dans un nom d'utilisateur et un mot de passe. Pour plus de commodité,

[~ # ~] éditer [~ # ~]

Je souhaite enregistrer le dernier nom d'utilisateur et/ou mot de passe entré dans un fichier sur le téléphone Pour éviter de la saisir l'utilisateur à chaque fois.

J'ai regardé - ceci , mais il semble être plus orienté navigateur ..

Des questions:

  • Comment ira-t-je crypter le fichier ou le mot de passe? Je ne peux pas simplement utiliser une clé de codée dur pour le crypter, puis-je? Je devrais générer la clé en quelque sorte. Cependant, si l'utilisateur sort et redémarre - je suppose qu'une clé distincte serait générée - je dois donc enregistrer la clé en quelque sorte?
  • Devrais-je déranger crypter? (Je pense que je devrais, mais seul l'utilisateur aurait accès à ce fichier de toute façon ...)

modifier 2

Suis-je sur-compliquer ces choses avec des clés de substitution et/ou une authentification de clé publique avec SSL/TSL? Je veux dire, Firefox enregistre mes mots de passe, et ils sont sûrement cryptés d'une manière ou d'une autre? Je pensais crypter l'utilisateur/passer de la même manière? Est-ce une mauvaise idée?

7
f20k

J'aime la suggestion de Symcbean de créer une valeur mappée aléatoire sur la connexion liée au compte séparément du nom d'utilisateur et du mot de passe. Pour répondre spécifiquement à votre question, il existe également des moyens de crypter les données sans une clé mappée statique. Je regarderais générer une clé utilisant des bits d'informations uniques au téléphone et récupérable via les appels d'API OS.

éditer: à la demande de @DW, je vais élaborer: l'UDID, le numéro de série et d'autres informations d'identification peuvent être suffisamment de qualité cryptographique et de secret sans accès au téléphone pour empêcher le déchiffrement de la mémoire stockée. Les données. Cependant, l'accès aux données stockées implique également un accès probablement au téléphone. Ainsi, tout niveau de sécurité via le cryptage local de l'appareil est une simple obscurité.

D'autres répondants ont suggéré de stocker une valeur aléatoire comme dans les sessions HTTP. Il semble que l'adresseur d'origine n'utilise pas HTTP et ne croit pas que cette méthode s'applique à son logiciel. Toutefois, la mise en œuvre logique de stockage et de transmission d'une valeur aléatoire est applicable à tout protocole de transport. Je le suggère fortement.

Alternativement, les informations d'identification peuvent être stockées sur le téléphone à l'aide du cryptage de clé publique. L'application peut chiffrer le nom d'utilisateur et le mot de passe lors de l'entrée avec la clé publique du serveur. Les données de connexion seraient donc illisibles même si l'appareil était compromis.

Lorsque l'objectif est d'empêcher la récupération des informations de connexion, je pense que l'utilisation d'un identifiant temporel aléatoire est la meilleure. Cela empêche toute question de garder les données du serveur (une clé privée) et disponible. Si cette clé a été divulguée, la protection est marginale à inutile. S'il est perdu, l'application doit être redéployée avec une nouvelle clé. Si les données de connexion temporelle ont été perdues, tout le monde serait obligé de se connecter, mais cela n'entraînerait aucune interruption appréciable du service.

En outre, utilisez le cryptage clé publique du transport (SSL ou une clé PGP simple intégrée à l'application) pour la connexion initiale et toutes les autres données d'authentification possibles, qu'il s'agisse du nom d'utilisateur et de mot de passe ou une valeur aléatoire.

6
Jeff Ferland

N'utilisez pas le nom d'utilisateur/mot de passe pour le jeton!

S'il est possible de déchiffrer, il y a un risque qu'il sera déchiffré. Et même si la plupart des peolpes savent qu'ils ne devraient pas, ils utilisent les mêmes mots de passe pour plusieurs services - donc même si votre service n'est pas particulièrement utile, vous avez la responsabilité de protéger les passworsd qui vous sont données.

La manière de résoudre le problème est la même chose que la gestion des sessions HTTP - utilisez un identifiant de substitution (qui peut contenir la même valeur que le cookie de session - mais avec une durée de vie plus longue), maintenez une table de recherche de l'identifiant de substitution, l'utilisateur c'était délivré à et à l'heure d'expiration.

4
symcbean

La 2e option de D.W.'s est la mieux implémentée avec les corrections suivantes et les détails supplémentaires:

  • générez une clé KeyPair sur l'application, une fois que l'utilisateur ait authentifié avec succès à l'aide du mécanisme d'authentification normal et lors de cette session authentifiée.
  • générer un UUID au téléphone (N'utilisez pas l'identifiant de périphérique intégré de l'OS/API ni d'autres identificateurs uniques que toute autre application peut également récupérer), chiffrer le chiffre * et le stocker (* voir ci-dessous pour les meilleures pratiques de cryptage pour les données de l'application sur un téléphone portable).
  • utilisez de manière programmative une combinaison de l'UUID et de certains détails téléphoniques disponibles, maque un peu (plutôt que simplement les concaténer) pour générer une application appdreviceID que seule votre application sait.
  • envoyez la clé publique + appDeviceID sur le serveur sur un canal sécurisé (SSL/TLS signé par une CA vraiment fiable), pas de compromis, pour enregistrer l'appareil et la clé publique.
  • maintenant, pour le cryptage: générer de manière programmée une clé de cryptage à l'aide d'une combinaison d'une UUID (pas celle que vous utilisez pour faire appDeviceID) et certains détails téléphoniques disponibles, maque un peu (plutôt que simplement les concaténer). Si vous pouvez attacher le mot de passe/la broche du blocage du téléphone, mieux meilleur (sur iOS, cela se fait sous la hotte avec le porte-clés, IFF utilise en fait un mot de passe/une broche de blocage).
  • stockez l'UUID que vous avez créé pour générer la clé de cryptage au stockage que seule votre application est "autorisée" d'accéder (en gardant à l'esprit qu'un périphérique enraciné signifie une application ou un utilisateur peut probablement y accéder à toute autre manière ... et c'est le point le plus faible) .
  • encrypypt et stocker l'UUID que vous avez créé pour l'AppDeViceID et chiffrer et stocker la clé privée cryptée. Encore une fois, utilisez le stockage que seule votre application est "autorisée" d'accéder (en gardant à l'esprit qu'un périphérique enraciné signifie une application ou un utilisateur peut probablement y accéder à toute autre manière).
  • pour vous authentifier à l'avenir, l'application doit signer une charge utile connue de l'application et du serveur, par exemple. L'AppDeviceID, en utilisant la clé privée et envoyez-le sur un canal sécurisé (SSL/TLS, etc.) sur le serveur. Le serveur doit vérifier la signature à l'aide de la clé publique.
  • Si le serveur reçoit jamais une tentative d'authentification, à l'aide d'un appDeviceID donné, qui échoue, supprimez/supprimez/oubliez la clé publique enregistrée et bloquez toutes les tentatives supplémentaires pour authentifier à l'aide de ce mécanisme KeyPair jusqu'à ce que l'utilisateur authentifie en utilisant d'autres, (généralement) plus sûrs. , Technique éprouvée et testée (telle que le processus d'authentification que vous augmentez avec cette nouvelle ou en personne avec les bons documents, etc.).
  • l'ajout de délai sur le clavier est encore meilleur (atténuer le détournement prolongé), ainsi que l'utilisateur doit s'authentifier à l'aide d'une technique plus sécurisée et éprouvée de temps à autre.

Via ce qui précède, il faudrait une décompilation et une ingénierie inverse du code + accès aux données stockées sur le périphérique (accès physique au périphérique OR _ application malveillante sur le périphérique enracinée) + connaissance de l'appareil (empreinte digitale via un tour OR _ Accès physique au périphérique OR _ Contrôle d'une application sur le périphérique) Pour pouvoir utiliser ce keypair et cette appdeviceid pour s'authentifier.

3
straya