web-dev-qa-db-fra.com

Stockage de jetons d'authentification sur iOS - NSUserDefaults vs Keychain?

Quel est l'endroit où je devrais stocker des jetons lorsque l'utilisateur se connecte à un service? Je ne garde pas les mots de passe (évidemment où je voudrais utiliser le trousseau), mais juste le jeton. Beaucoup d'endroits disent simplement utiliser NSUserDefaults mais certaines personnes sur StackOverflow semblent vraiment très friandes du trousseau.

NSUserDefaults est-il correct?

56
Doug Smith

Je vous recommande fortement d'utiliser le trousseau - c'est exactement ce que Facebook fait pour stocker ses jetons de session.

NSUserDefaults n'est pas sécurisé ou crypté - il peut être facilement ouvert et lu, à la fois sur le périphérique et lorsqu'il est synchronisé sur un Mac. Ainsi, bien que les valeurs par défaut des utilisateurs constituent un bon emplacement pour des éléments tels que les préférences et les informations de configuration, ce n'est pas un bon emplacement pour les éléments sensibles, tels que les mots de passe.

Les jetons de session doivent presque toujours être traités de la même manière que les mots de passe. Vous devez donc les stocker en toute sécurité dans le trousseau, où ils seront chiffrés. Apple dispose d'un exemple de code ( GenericKeychain ) qui illustre une implémentation de base. Vous trouverez d'autres exemples en effectuant une recherche dans StackOverflow. J'espère que ça vous a aidé.

81
lxt

NSUserDefaults peut être utilisé sans aucun problème . Veuillez consulter la documentation https://developer.Apple.com/documentation/security/keychain_services

Les services de porte-clés sont inventés avec les «secrets» qui intéressent explicitement l'utilisateur, à savoir les mots de passe, les clés privées ou même les notes sécurisées, à savoir les informations d'identification claires. Mais les jetons d'accès sont des hachages temporaires générés après la saisie du mot de passe par l'utilisateur et ont une durée limitée. Et même s'il est volé, le malfaiteur ne peut pas complètement voler le compte - le propriétaire peut se connecter sur un autre appareil et le jeton d'accès précédent sera réinitialisé. Donc, formellement, il n'y a aucune interdiction de stocker des jetons d'accès dans UserDefaults.

Les données de UserDefaults ne peuvent être volées que si le périphérique est lui-même volé, mais je pense que le niveau de sécurité du contenu est beaucoup plus bas que le périphérique physique lui-même. Je pense que l'utilisateur ne s'inquiéterait pas du jeton dans ce cas, mais de l'appareil.

Cependant, c’est une bonne pratique de le stocker dans Keychain, mais c’est simplement un usage excessif (!) De la sécurité, généralement recommandé par des utilisateurs aléatoires d’Internet et non requis par Apple. Apple ne fournit aucune documentation à ce sujet. Ils indiquent que les jetons doivent être stockés dans le trousseau (si vous en trouvez un, veuillez en commenter un ci-dessous).

La réponse est donc: vous pouvez utiliser les deux. Toutefois, si votre application fonctionne avec un contenu qui coûte beaucoup plus cher qu'un iPhone volé, il est préférable d'utiliser Keychain, mais ce n'est qu'une recommandation.

0
Alexander Volkov