Comment convertir String
en SecureString
?
Vous pas. La raison d’utiliser l’objet SecureString est d’éviter de créer un objet chaîne (chargé en mémoire et conservé en texte brut jusqu’à la récupération de place). 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');
Il existe également un autre moyen de convertir entre SecureString
et String
.
1. Chaîne à SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString to String
string theString = new NetworkCredential("", theSecureString).Password;
Voici le lien
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;
}
Vous pouvez suivre ceci:
string password = "test";
SecureString sec_pass = new SecureString();
Array.ForEach(password.ToArray(), sec_pass.AppendChar);
sec_pass.MakeReadOnly();
Je vais jeter ça dehors. Pourquoi?
Vous ne pouvez pas simplement changer toutes vos chaînes pour sécuriser des chaînes et tout à coup votre application est "sécurisée". Chaîne sécurisée est conçue pour conserver la chaîne cryptée aussi longtemps que possible et uniquement pendant une très courte période, en effaçant la mémoire après une opération.
Je risquerais de dire que vous pouvez avoir des problèmes de conception avant de vous préoccuper de la sécurité de vos chaînes d’application. Donnez-nous plus d'informations sur ce que vous essayez de faire et nous pourrons peut-être vous aider.
unsafe
{
fixed(char* psz = password)
return new SecureString(psz, password.Length);
}
Voici un truc linq pas cher.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(c => sec.AppendChar(c));
/* and now : seal the deal */
sec.MakeReadOnly();
Je suis d'accord avec Spence (+1), mais si vous le faites pour apprendre ou tester des règles, vous pouvez utiliser un foreach dans la chaîne, en ajoutant chaque caractère à la chaîne sécurisée à l'aide de la méthode AppendChar.
pas de linq fantaisie, sans 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);
Les 2 extensions suivantes devraient faire l'affaire:
Pour un tableau char
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 recommandation AppendChar
.
Si vous souhaitez compresser la conversion d'une string
en une SecureString
en une instruction LINQ
, 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 de LINQ
n'améliore pas la sécurité de cette solution. Elle souffre du même problème que toute conversion de string
à SecureString
. Tant que la string
d'origine reste en mémoire, les données sont vulnérables.
Cela dit, la déclaration ci-dessus peut offrir garder en même temps la création de la variable SecureString
, son initialisation avec des données et le verrouiller de toute modification.
vous pouvez utiliser ce script simple
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}