L'utilisation sécuritaire de SecureString pour le formulaire de connexion

Il y a donc cette classe qui semble très peu utilisés: SecureString. Il a été autour depuis 2.0 au moins, et il y a DONC quelques questions sur elle, mais je pensais que je demande à mes propres questions:

J'ai un LoginForm; simple WinForms dialogue avec nom d'utilisateur et (masqué) champs de mot de passe. Lorsque l'utilisateur entre les deux et clique sur "Login", l'information est transmise à l'injection d'une authentification de classe qui fait une couche d'étirement, puis les hachages de la moitié de la étiré clé pour la vérification et l'autre moitié est la clé symétrique de l'utilisateur crypté des données de compte. Quand tout cela est à travers, le loginForm est fermé, l'authentificateur classe jeté, et le système se déplace sur le chargement du formulaire principal. Les choses assez standard, peut-être un peu plus que la norme de hachage du mot de passe et de les comparer, mais le simple mot de passe haché serait battu dans mon cas, en stockant les données de l'utilisateur en clair, parce que les données comprennent des informations d'identification pour un système de tiers (et nous savons tous comment les gens comme à la réutilisation des mots de passe).

Voici la première question; comment puis-je utiliser SecureString pour récupérer le mot de passe dans la zone Mot de passe, sans il être exposée comme un Système ordinaire.Chaîne à travers le Texte de la propriété de la zone de texte? Je suppose que il y a un moyen d'accéder à la non géré GDI fenêtre pour la zone de texte c'est d'être enveloppé par le CLR classes, et tirez sur les données de texte en utilisant le Maréchal de classe. Je ne sais pas comment, et je n'arrive pas à trouver de bonnes informations.

Voici la deuxième question, une fois que j'ai le mot de passe comme un SecureString, comment puis-je passer à un fournisseur de hachage à partir du Système.De sécurité.Crypto espace de noms? Ma conjecture est que j'aimerais utiliser le Maréchal.SecureStringToBSTR(), puis Maréchal.Copier() de l'retourné IntPtr de retour dans un tableau d'octets. Je peux ensuite appeler le Maréchal.ZeroBSTR() pour nettoyer la mémoire non managée et je peux remettre à zéro la matrice avec le Tableau.Clear() une fois que j'ai le hachage. Si il y a une manière plus propre que me permet le plein contrôle sur la durée de vie d'un gérés copie de la mémoire, ne le dis.

Troisième question; Est-ce vraiment nécessaire, ou est l'insécurité inhérente au Système.Chaîne de caractères dans une gestion de la mémoire de l'environnement un peu exagéré? Rien utilisée pour stocker le mot de passe, crypté ou autrement, devrait être hors de portée et sur son chemin vers le garbage collector longtemps avant que le système d'exploitation serait de considérer la permutation de l'application dans la mémoire virtuelle (permettant le mot de passe pour être détecté à partir du fichier d'échange après une dure de l'arrêt de l'ordinateur). Un froid boot attaque est une possibilité théorique, mais vraiment, comment est-ce? Le problème, c'est le maintenant déchiffré les données de l'utilisateur, qui traîne dans le cadre de l'utilisateur pour l'ensemble de la vie de l'application (et donc serait un candidat de choix pour l'utilisation de SecureStrings, que, sauf pour un couple de base usages qu'ils restent assez dormant).

InformationsquelleAutor KeithS | 2013-01-22