Как преобразовать String
в SecureString
?
Преобразовать строку в SecureString
Ответ 1
Нет. Вся причина использования объекта SecureString заключается в том, чтобы избежать создания строкового объекта (который загружается в память и хранится там в виде открытого текста до сбора мусора). Однако вы можете добавить символы в SecureString, добавив их.
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');
Ответ 2
ниже метод помогает преобразовать строку в защищенную строку
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;
}
Ответ 3
Существует также другой способ преобразования между SecureString
и String
.
1. Строка в SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString to String
string theString = new NetworkCredential("", theSecureString).Password;
Вот ссылка
Ответ 4
Вы можете следить за этим:
string password = "test";
SecureString sec_pass = new SecureString();
Array.ForEach(password.ToArray(), sec_pass.AppendChar);
sec_pass.MakeReadOnly();
Ответ 5
unsafe
{
fixed(char* psz = password)
return new SecureString(psz, password.Length);
}
Ответ 6
Я выброшу это. Почему?
Вы не можете просто изменить все свои строки для защиты строк и вдруг ваше приложение "безопасно". Защищенная строка предназначена для того, чтобы держать строку зашифрованной как можно дольше и только расшифровываться в течение очень короткого периода времени, вытирая память после выполнения операции над ней.
Я бы сказал, что у вас могут возникнуть проблемы с уровнем дизайна, прежде чем беспокоиться о защите строк приложений. Дайте нам дополнительную информацию о том, что вы пытаетесь сделать, и мы сможем помочь лучше.
Ответ 7
Вот дешевый трюк linq.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(c => sec.AppendChar(c));
/* and now : seal the deal */
sec.MakeReadOnly();
Ответ 8
Я согласен с Spence (+1), но если вы делаете это для обучения или тестирования, вы можете использовать foreach в строке, добавляя каждый char к securestring, используя метод AppendChar.
Ответ 9
нет фантазии linq, не добавляя все символы вручную, просто и просто:
var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
Ответ 10
Если вы хотите сжать преобразование string
в SecureString
в оператор LINQ
, вы можете выразить его следующим образом:
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; }
);
Однако имейте в виду, что использование LINQ
не повышает безопасность этого решения. Он страдает от того же недостатка, что и любое преобразование от string
до SecureString
. Пока исходный string
остается в памяти, данные уязвимы.
Как сказано выше, предложение, предлагаемое выше, заключается в объединении создания SecureString
, его инициализации с данными и, наконец, блокировки его из модификации.
Ответ 11
вы можете использовать этот простой script
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
Ответ 12
Следующие 2 расширения должны сделать трюк:
-
Для массива
char
public static SecureString ToSecureString(this char[] _self) { SecureString knox = new SecureString(); foreach (char c in _self) { knox.AppendChar(c); } return knox; }
-
И для
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; }
Спасибо John Dagg за рекомендацию AppendChar
.