N'hésitez pas à me corriger si mes hypothèses sont erronées ici, mais laissez-moi vous expliquer pourquoi je demande.
Tiré de MSDN, un SecureString
:
Représente un texte qui doit rester confidentiel. Le texte est crypté pour plus de confidentialité lors de son utilisation et supprimé de la mémoire de l'ordinateur lorsqu'il n'est plus nécessaire.
Je comprends cela, il est parfaitement logique de stocker un mot de passe ou d'autres informations privées dans un SecureString
sur un System.String
, car vous pouvez contrôler comment et quand il est réellement stocké en mémoire, car un System.String
:
est à la fois immuable et, lorsqu'il n'est plus nécessaire, ne peut pas être programmé pour la collecte des ordures; en d'autres termes, l'instance est en lecture seule après sa création et il n'est pas possible de prédire quand l'instance sera supprimée de la mémoire de l'ordinateur. Par conséquent, si un objet String contient des informations sensibles telles qu'un mot de passe, un numéro de carte de crédit ou des données personnelles, il existe un risque que les informations soient révélées après leur utilisation car votre application ne peut pas supprimer les données de la mémoire de l'ordinateur.
Cependant, dans le cas d'une application GUI (par exemple, un client ssh), le SecureString
doit être construit à partir d'un System.String
. Tous les contrôles de texte utilisent une chaîne comme type de données sous-jacent .
Cela signifie donc que chaque fois que l'utilisateur appuie sur une touche, l'ancienne chaîne qui s'y trouvait est supprimée et une nouvelle chaîne est créée pour représenter la valeur à l'intérieur de la zone de texte, même si vous utilisez un masque de mot de passe. Et nous ne pouvons pas contrôler quand ou si l'une de ces valeurs est supprimée de la mémoire .
Il est maintenant temps de vous connecter au serveur. Devine quoi? Vous devez passer une chaîne sur la connexion pour l'authentification . Convertissons donc notre SecureString
en un System.String
.... et maintenant nous avons une chaîne sur le tas sans aucun moyen de la forcer à passer par la récupération de place (ou d'écrire des 0 dans son tampon).
Mon point est : peu importe ce que vous faites, quelque part le long de la ligne, qui SecureString
est va être transformé en un System.String
, ce qui signifie qu'il sera au moins exist sur le tas à un moment donné (sans aucune garantie de la collecte des ordures).
Mon point n'est pas : s'il existe des moyens de contourner l'envoi d'une chaîne à une connexion ssh, ou de contourner le fait qu'un contrôle stocke une chaîne (créer un contrôle personnalisé). Pour cette question, vous pouvez remplacer "connexion ssh" par "formulaire de connexion", "formulaire d'inscription", "formulaire de paiement", "aliments-vous-nourririez votre chiot mais pas vos enfants", etc.
- Alors, à quel moment l'utilisation d'un système
SecureString
devient-elle réellement pratique? - Cela vaut-il la peine de consacrer plus de temps au développement pour éliminer complètement l'utilisation d'un
System.String
objet? - Le but est-il
SecureString
simplement de réduire la quantité de temps qu'ilSystem.String
y a sur le tas (ce qui réduit son risque de passer à un fichier d'échange physique)? - Si un attaquant a déjà les moyens pour une inspection en tas, puis il le plus probable soit (A) a déjà les moyens de lire des séquences de touches, ou (B) déjà a physiquement la machine ... Alors serait l' aide d' un
SecureString
l'empêcher de se rendre à la données de toute façon? - Est-ce juste "la sécurité par l'obscurité"?
Désolé si je pose des questions trop épaisses, la curiosité a pris le dessus sur moi. N'hésitez pas à répondre à une ou toutes mes questions (ou dites-moi que mes hypothèses sont complètement fausses). :)
SecureString
n'est pas vraiment une chaîne sécurisée. C'est simplement un moyen de réduire la fenêtre de temps dans laquelle quelqu'un peut inspecter votre mémoire et obtenir avec succès les données sensibles. Ce n'est pas à l'épreuve des balles et ce n'était pas prévu. Mais les points que vous soulevez sont très valables. Connexe: stackoverflow.com/questions/14449579/…