Comment convertir String
en SecureString
?
Comment convertir String
en SecureString
?
Réponses:
Vous ne le faites pas. La raison de l'utilisation de l'objet SecureString est d'éviter de créer un objet chaîne (qui est chargé en mémoire et y est conservé en texte brut jusqu'au garbage collection). Cependant, vous pouvez ajouter des caractères à un SecureString en les ajoutant.
var s = new SecureString();
s.AppendChar('d');
s.AppendChar('u');
s.AppendChar('m');
s.AppendChar('b');
s.AppendChar('p');
s.AppendChar('a');
s.AppendChar('s');
s.AppendChar('s');
s.AppendChar('w');
s.AppendChar('d');
*****
AppendChar
ne s'exécute pas avant l'exécution, donc ces caractères peuvent toujours être lus à partir de l'IL, n'est-ce pas? Peut-être qu'un obscurcissement lors de la compilation aiderait également ... c'est-à-dire si vous codez en dur des mots de passe.
Il existe également une autre façon de convertir entre SecureString
et String
.
1. Chaîne à SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString à String
string theString = new NetworkCredential("", theSecureString).Password;
Voici le lien
SecureString
si votre code crée un string
objet avec la valeur que vous souhaitez sécuriser. Le but de SecureString
est d'éviter d'avoir la chaîne dans la mémoire gérée, afin qu'un attaquant examinant cette mémoire puisse repérer la valeur que vous souhaitez masquer. Étant donné que le NetworkCredential
constructeur que vous appelez nécessite une chaîne, ce n'est pas la voie à suivre ... Bien sûr, votre code est un moyen facile de convertir vers et depuis un SecureString, mais son utilisation rend votre code aussi sûr que l'utilisation d'un simplestring
SecureString
lorsque nous travaillons avec certaines bibliothèques. Et soyons honnêtes ici, si quelqu'un scanne activement la mémoire de votre application, vous avez déjà perdu. Même si vous avez utilisé correctement SecureString, ce que je n'ai jamais vu, il y aura d'autres données précieuses à extraire.
La méthode ci-dessous permet de convertir une chaîne en chaîne sécurisée
private SecureString ConvertToSecureString(string password)
{
if (password == null)
throw new ArgumentNullException("password");
var securePassword = new SecureString();
foreach (char c in password)
securePassword.AppendChar(c);
securePassword.MakeReadOnly();
return securePassword;
}
Voici une astuce linq bon marché.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
Je vais jeter ça là-bas. Pourquoi?
Vous ne pouvez pas simplement changer toutes vos chaînes en chaînes sécurisées et soudainement votre application est "sécurisée". La chaîne sécurisée est conçue pour garder la chaîne cryptée aussi longtemps que possible, et uniquement décryptée pendant une très courte période de temps, effaçant la mémoire après qu'une opération a été effectuée sur elle.
Je risquerais de dire que vous pourriez avoir des problèmes au niveau de la conception à résoudre avant de vous soucier de la sécurisation de vos chaînes d'application. Donnez-nous plus d'informations sur ce que vous essayez de faire et nous pourrons peut-être mieux vous aider.
pas de linq fantaisie, ne pas ajouter tous les caractères à la main, simplement et simplement:
var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
var sc = new SecureString(); foreach(char c in "foo") sc.appendChar(c);
Je veux juste signaler à toutes les personnes qui disent: "Ce n'est pas le but de SecureString
", que bon nombre des personnes qui posent cette question peuvent se trouver dans une application où, pour une raison quelconque, justifiée ou non, elles ne sont pas particulièrement préoccupées par le fait d'avoir une copie temporaire du sit mot de passe sur le tas comme une chaîne de GC-mesure, mais ils doivent utiliser une API qui n'accepte des objets. Donc, vous avez une application où vous ne vous souciez pasSecureString
si le mot de passe est sur le tas, peut-être qu'il est à usage interne uniquement et le mot de passe est uniquement là parce qu'il est requis par les protocoles réseau sous-jacents, et vous trouvez que cette chaîne où le mot de passe est stocké ne peut pas être utilisée pour, par exemple, configurer un PowerShell distant Runspace - mais il n'y a pas de one-liner simple et simple pour créer ce SecureString
dont vous avez besoin. Il est un inconvénient mineur - mais probablement la peine de veiller à ce que les applications qui vraiment font besoin d' SecureString
ne pas tenter les auteurs à l' utilisation System.String
ou System.Char[]
intermédiaires. :-)
Si vous souhaitez compresser la conversion de a string
en a SecureString
en une LINQ
instruction, vous pouvez l'exprimer comme suit:
var plain = "The quick brown fox jumps over the lazy dog";
var secure = plain
.ToCharArray()
.Aggregate( new SecureString()
, (s, c) => { s.AppendChar(c); return s; }
, (s) => { s.MakeReadOnly(); return s; }
);
Cependant, gardez à l'esprit que l'utilisation LINQ
n'améliore pas la sécurité de cette solution. Il souffre du même défaut que toute conversion de string
vers SecureString
. Tant que l'original string
reste en mémoire, les données sont vulnérables.
Cela étant dit, ce que l'instruction ci-dessus peut offrir est de garder ensemble la création du SecureString
, son initialisation avec des données et enfin le verrouiller contre toute modification.
Les 2 extensions suivantes devraient faire l'affaire:
Pour un char
tableau
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
Et pour string
public static SecureString ToSecureString(this string _self)
{
SecureString knox = new SecureString();
char[] chars = _self.ToCharArray();
foreach (char c in chars)
{
knox.AppendChar(c);
}
return knox;
}
Merci à John Dagg pour la AppendChar
recommandation.
vous pouvez utiliser ce simple script
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
12345
... c'est le genre de chose qu'un idiot a sur ses bagages!"