2009-09-27 1 views
5

J'écris une application qui doit lire un nom d'utilisateur et un mot de passe et les stocker afin que le programme puisse les relire plus tard. Le stocker dans certaines variables semble être une idée stupide.Enregistrement de mots de passe dans une application

Trouvé que KDE library, mais il a une dépendance trop énorme, et je suis programmeur trop novice pour comprendre comment l'utiliser. Quelles sont les méthodes courantes pour stocker les mots de passe et comment résoudre mon problème?

Répondre

7

Cela dépend de ce que vous allez faire avec l'information. Si vous utilisez le nom et le mot de passe pour accéder à un service externe (mais que l'utilisateur devra entrer à nouveau les informations lors de la prochaine exécution du programme), il est préférable de les stocker dans certaines variables. Il peut être judicieux de les stocker cryptées (au moins, stocker le mot de passe crypté) de sorte qu'il n'est pas visible dans les vidages de base ou l'équivalent. Lorsque le mot de passe est requis, vous le déchiffrez, l'utilisez, puis écrivez là où la version déchiffrée a été stockée (zappée). (Remarque: le hachage n'est pas approprié dans ce contexte, vous devez être capable de voir le mot de passe, et vous ne pouvez pas annuler un hachage.) Vous pouvez décider de stocker les informations en dehors du programme (dans un fichier disque), mais ne semble pas nécessaire. Notez que le binaire contiendra toujours la clé de cryptage (et l'algorithme de cryptage), et les données cryptées sont plus aléatoires que le contenu moyen de votre programme, donc vraiment dissimuler le mot de passe crypté est très difficile (presque impossible). Cependant, vous pouvez le rendre assez difficile pour arrêter tous les attaquants, sauf les plus déterminés.

Si vous stockez le nom d'utilisateur et le mot de passe en tant qu'enregistrement permanent afin de pouvoir valider que le même utilisateur accède aux informations dans le futur, vous devez utiliser un stockage externe au programme; vous utiliserez une base de données simple, qui pourrait être aussi simple qu'un fichier texte si vous vous assurez de résoudre les problèmes de concurrence. Dans ce cas, vous devrez hacher le mot de passe avec un peu de sel, et vous stockez le nom d'utilisateur, le mot de passe salt et hashed de telle sorte que, compte tenu du nom d'utilisateur, vous pouvez facilement trouver les deux autres valeurs.


commentaires Nuit Walker:

J'utilise ce mot de passe pour accéder à une base de données web, donc je besoin stocké dans ma demande une fois qu'il est entré pour la première fois. Êtes-vous sûr qu'un fichier texte brut est une idée intelligente?

Cela dépend de la façon dont vous concevez «stocké dans mon application». Vous ne pouvez pas modifier l'exécutable, ou du moins ne devriez pas essayer de le faire. Donc, vous devez regarder comme un enregistrement permanent stocké dans une sorte de fichier distinct de l'exécutable de l'application. D'un autre côté, vous faites face à un problème différent de ce que j'ai décrit - vous n'authentifiez pas l'utilisateur avec l'information; vous devez déchiffrer les informations à la demande pour les envoyer à d'autres applications. Tout d'abord, cela signifie que les sels et les hachages ne sont pas pertinents; vous devez inverser l'opération de masquage, et vous ne pouvez pas inverser un hachage.

Ensuite, vous devez décider comment identifier l'utilisateur de votre application lors de sa réapparition. L'utilisateur sera-t-il obligé d'entrer un mot de passe pour accéder à ses propres données, ou vous ferez-vous simplement confiance aux privilèges du système d'exploitation ou à un autre système? Si l'utilisateur doit entrer un mot de passe dans votre application pour démarrer, vous pouvez utiliser ce mot de passe (ou un hachage, différent du mot de passe utilisé pour reconnaître le mot de passe de l'application) pour crypter le nom d'utilisateur/combinaison de mot de passe pour l'application externe. Vous pouvez ensuite stocker le nom d'utilisateur et, à titre d'argument, une version codée en Base 64 du mot de passe chiffré dans un fichier texte; C'est aussi sûr que le mot de passe de l'application, qui est stocké dans le format de hachage salé d'origine. Lorsque l'utilisateur revient, il doit fournir son nom d'utilisateur et son mot de passe, et vous pouvez valider cette combinaison par rapport aux valeurs stockées, puis utiliser le mot de passe pour déchiffrer le mot de passe de l'application externe.

Si l'utilisateur n'entre pas de mot de passe, vous êtes limité dans ce que vous pouvez faire. Vous devez être en mesure de déterminer une clé à partir des informations qui peuvent être utilisées pour stocker le mot de passe crypté de l'utilisateur dans un fichier dans un emplacement restreint tel qu'un sous-répertoire situé sous son répertoire personnel sans accès au groupe ou au public:

mkdir ~/.appname 
chmod 700 ~/.appname 
cp /dev/null ~/.appname/app.key 
...store the encrypted information... 
chmod 500 ~/.appname 
chmod 400 ~/.appname/app.key 

Ceci est moins satisfaisant car même si vous combinez une clé fixe avec le nom de l'utilisateur, par exemple, les chances sont que quelqu'un peut travailler ce que la clé est (et la technologie de cryptage) et le désossage. (Le secret des données cryptées dépend des clés, lorsque la clé est déterminable par le programme, il est également déterminable par un attaquant déterminé .Il vaut mieux, de loin, compter sur l'utilisateur pour fournir la clé (ou un mot de passe ou phrase de passe) lors de l'exécution, puis l'application ne stocke rien qu'un attaquant peut utiliser hors ligne

+0

J'utilise ce mot de passe pour accéder à une base de données web, donc j'en ai besoin stocké dans mon application après son entrée pour la première fois. Êtes-vous sûr que le fichier texte brut est cette idée intelligente? –

+0

comme je le vois le record permanent est la meilleure idée jusqu'à maintenant. l'application n'a pas d'autres mots de passe, et il ne compte pas que les autres utilisateurs vont utiliser cette application. seule chose est d'essayer de sauver le mot de passe + nom d'utilisateur d'autres ppl. –

+0

Oui, le stockage des informations dans un fichier permanent sera nécessaire. Utilisez un fichier distinct pour chaque utilisateur de l'application; stocker le mot de passe crypté dans l'encodage Base-64 (de sorte que vous avez un fichier texte brut). Dérivez la clé utilisée pour le cryptage à partir d'un hachage cryptographique de ce que vous considérez comme les caractéristiques les plus fiables de l'utilisateur (peut-être une concaténation de son nom d'utilisateur et numéro d'utilisateur, et peut-être du texte fixe) un emplacement que vous pouvez concevoir. La sécurité est loin d'être parfaite - ce que vous pouvez concevoir, vos attaquants peuvent découvrir. –

0

quel type d'application est-il? Il existe de nombreuses méthodes, mais si ASP.Net il est commun de crypter dans le fichier web.config.

+0

C'est l'application C++ multi-plateforme (pas une applet web) –

5

Habituellement, vous stockez le nom d'utilisateur et une version hachée du mot de passe. Voir cet article wikipedia: hash functions, et ce question.

+2

Hash du mot de passe ne sera pas utile si vous avez besoin d'utiliser le mot de passe plus tard pour vous connecter au système distant ou quelque chose comme ça. –

+0

Absolument ..... – Peter

1

Qu'en est-MySQL ou SQLite Hacher le mot de passe et de les stocker dans une base de données persistante, pas

1

commune.? La méthode pour stocker les mots de passe pour une utilisation ultérieure est de les stocker dans un cache crypté.Ce cache est crypté en utilisant un mot de passe maître.Utilisateur doit entrer le mot de passe maître chaque fois que vous avez besoin de mot de passe du cache KeePassX est une petite application open source stocker des données personnelles (noms d'utilisateur, p asswords, etc.) Il a une interface légère, est multi plate-forme et publié sous les termes de la GNU General Public License. Vous pouvez le vérifier en tant qu'échantillon et en utiliser certaines parties.

0

Sur spotep.com nous ne stockons que le nom d'utilisateur et un hashcode du nom d'utilisateur combiné avec le mot de passe. L'avantage de ceci est que des mots de passe similaires (souvent triviaux) n'aboutiront pas au même hashcode (qui est stocké dans un cookie, et donc très dangereux).

+0

beau site web mais vous avez manqué beaucoup de séries là caprica, battlestar galactica, fils de l'anarchie etc ... –

+0

Hmm, No we do? –

1

Je suggère de stocker un mot de passe haché dans SQLite. Ensuite, chaque fois que vous avez besoin de vérifier un mot de passe, hachez-le, puis comparez-le à la valeur enregistrée. Cela permet de sécuriser les mots de passe stockés afin que personne (pas même vous) ne sache ce qu'ils sont.

1

Vous pouvez essayer QSettings qui fournit des paramètres d'application persistants indépendants de la plate-forme. Des solutions comme mysql seraient exagérées sauf si vous avez des centaines de mots de passe à stocker.