185 votes

Quand dois-je une SecureString dans .NET ?

Je suis en train de grok le but de .NET SecureString. À partir de MSDN:

Une instance du Système.La classe String est à la fois immuable et, lorsqu'il n'est plus nécessaire, ne peut pas être par programmation prévue pour la collecte des ordures, qui est, l'instance est en lecture seule fois qu'il est créé et il n'est pas possible de prédire quand l'instance va être supprimé de la mémoire de l'ordinateur. Par conséquent, si un objet de type String contient des informations confidentielles telles qu'un mot de passe, numéro de carte de crédit, ou de données personnelles, il existe un risque que les informations pourraient être révélé après qu'il est utilisé parce que votre application ne peut pas supprimer les données de la mémoire de l'ordinateur.

Un SecureString objet est similaire à un objet de type String dans lequel il a une valeur de texte. Toutefois, la valeur d'un SecureString objet est automatiquement chiffré, peut être modifié jusqu'à ce que votre demande de marque comme étant en lecture seule, et peuvent être supprimés de la mémoire de l'ordinateur soit par votre application ou de l' .NET Framework garbage collector.

La valeur d'une instance de SecureString est automatiquement cryptées lorsque l'instance est initialisé ou lorsque la valeur est modifiée. Votre application peut rendre l'instance immuable et empêcher la modification, par l'évocation de la MakeReadOnly méthode.

Est le cryptage automatique le grand profit?

Et pourquoi je ne peux pas juste dire:

SecureString password = new SecureString("password");

au lieu de

SecureString pass = new SecureString();
foreach (char c in "password".ToCharArray())
    pass.AppendChar(c);

Quel est l'aspect de SecureString qui me manque?

109voto

C. Lawrence Wenham Points 11271

Certaines parties du cadre qui utilisent actuellement SecureString:

  • WPF PasswordBox de contrôle conserve le mot de passe comme un SecureString en interne.
  • Système.Diagnostics.ProcessInfo du Mot de passe de la propriété est un SecureString.
  • Le constructeur de X509Certificate2 prend un SecureString pour le mot de passe.

Le but principal est de réduire la surface d'attaque, plutôt que de l'éliminer. SecureStrings sont "épinglé" dans la mémoire RAM de sorte que le Garbage Collector ne pas la déplacer ou d'en faire des copies. Il s'assure également que le texte en clair de ne pas écrites dans le fichier d'échange ou en core dumps. Le chiffrement est plus comme de la dissimulation et de ne pas arrêter déterminé un hacker, mais, qui serait en mesure de trouver la clé symétrique utilisée pour chiffrer et déchiffrer.

Comme d'autres l'ont dit, la raison pour laquelle vous devez créer un SecureString caractère par caractère est à cause de la première défaut évident de faire autrement: vous avez vraisemblablement la valeur du secret comme une simple chaîne de caractères déjà, alors, quel est le point?

SecureStrings sont la première étape dans la résolution d'un dilemme de la poule Et de l'Oeuf problème, de sorte que même si la plupart des scénarios actuels nécessitent de les convertir en arrière dans les cordes pour en faire un usage quelconque d'entre eux, leur existence dans le cadre des moyens de mieux appuyer pour eux dans le futur. Au moins, à un point où votre programme n'a pas à être le maillon faible.

37voto

Richard Morgan Points 4048

Beaucoup de réponses, en voici un rapide résumé de ce qui a été discuté.

Microsoft a mis en place le SecureString classe dans un effort pour fournir une meilleure sécurité des informations sensibles (comme les cartes de crédit, mots de passe, etc.). Il fournit automatiquement:

  • le chiffrement (en cas de vidages de mémoire ou la page en cache)
  • l'épinglage dans la mémoire
  • capacité de marquer en lecture seule (pour prévenir d'autres modifications)
  • fort de construction en ne permettant PAS une constante chaîne de caractères passée en

Actuellement, SecureString est d'un usage plus limité, mais s'attendre à une meilleure adoption dans l'avenir.

Basé sur cette information, le constructeur de la SecureString ne doit pas seulement prendre une corde et coupez-le en tranches jusqu'à char tableau comme ayant la chaîne de l'énoncé de défaites le but de SecureString.

Infos supplémentaires:

  • Un poste de la .FILET de Sécurité blog parle beaucoup de la même chose que couverts ici.
  • Et de l'autre un revisiter et de mentionner un outil que POUVEZ vider le contenu de la SecureString.

Edit: j'ai trouvé difficile de choisir la meilleure réponse, car il y a de bonnes informations dans de nombreux; dommage qu'il n'y est pas aidé les options de réponse.

15voto

Joe Points 60749

Il y a très peu de scénarios où vous pouvez raisonnablement utilisez-SecureString dans la version actuelle du Cadre. C'est vraiment utile pour interagir avec les Api non gérées - vous pouvez le maréchal à l'aide de Maréchal.SecureStringToGlobalAllocUnicode.

Dès que vous convertissez vers/à partir d'un Système.Chaîne, vous avez vaincu son but.

La MSDN de l'échantillon génère le SecureString un caractère à la fois d'entrée de la console et passe à la chaîne sécurisée à un non géré par l'API. C'est plutôt alambiqué et peu réaliste.

Vous pourriez vous attendre les futures versions de .NET pour avoir plus de soutien pour SecureString qui va le rendre plus utile, par exemple:

  • SecureString De La Console.ReadLineSecure() ou similaire à lire d'entrée de la console dans un SecureString sans tous les alambiqué code dans l'échantillon.

  • WinForms zone de texte de remplacement qui stocke ses de zone de texte.Texte de la propriété comme une chaîne sécurisée de sorte que les mots de passe peuvent être saisies de manière sécurisée.

  • Les Extensions liées à la sécurité des Api pour autoriser les mots de passe pour être passé comme SecureString.

Sans ci-dessus, SecureString sera de peu de valeur.

12voto

JoshReedSchramm Points 1729

Je crois que la raison pour laquelle vous avez à faire caractère ajoutant au lieu d'un plat d'instanciation est parce que dans le fond de passage "mot de passe" pour le constructeur de SecureString met "mot de passe" chaîne de caractères en mémoire vaincre le but de sécuriser la chaîne.

En ajoutant vous sont seulement en train de mettre un caractère à la fois dans la mémoire qui est susceptibles de ne pas être adjacents les uns aux autres physiquement rend d'autant plus difficile à reconstituer la chaîne d'origine. J'ai peut-être tort ici, mais c'est la façon dont il a été expliqué à moi.

Le but de cette classe est d'éviter de sécuriser l'exposition des données via un vidage de la mémoire ou d'un outil similaire.

11voto

Kevin Points 57797

MS sur certains cas de provoquer le serveur (bureau, peu importe) à planter n’ont trouvé de moments où l’environnement d’exécution serait faire un dump mémoire exposant le contenu de ce qui est en mémoire. Chaîne sécurisée il crypte en mémoire pour empêcher l’attaquant d’être en mesure de récupérer le contenu de la chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X