Преобразование строки в SecureString
Как преобразовать String
до SecureString
?
14 ответов
нет. Вся причина использования объекта SecureString заключается в том, чтобы избежать создания объекта string (который загружается в память и хранится там в открытом тексте до сборки мусора). Однако можно добавить символы в 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');
есть также другой способ конвертировать между SecureString
и String
.
1. Строка для SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. Объект SecureString в строку
string theString = new NetworkCredential("", theSecureString).Password;
здесь ссылке
ниже метод помогает преобразовать строку в защищенную строку
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;
}
вы можете следовать этому:
string password = "test";
SecureString sec_pass = new SecureString();
Array.ForEach(password.ToArray(), sec_pass.AppendChar);
sec_pass.MakeReadOnly();
я выброшу это там. Почему?
вы не можете просто изменить все свои строки, чтобы закрепить строки И вдруг приложение "Безопасность". Secure string предназначена для того, чтобы держать строку зашифрованной как можно дольше и расшифровываться только в течение очень короткого периода времени, стирая память после выполнения операции над ней.
Я бы рискнул сказать, что у вас могут быть некоторые проблемы с уровнем дизайна, Прежде чем беспокоиться о безопасности вашего строки приложения. Дайте нам больше информации о том, что вы пытаетесь сделать, и мы сможем помочь лучше.
вот дешевый трюк 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();
Я согласен со Спенсом (+1), но если вы делаете это для обучения или тестирования pourposes, вы можете использовать foreach в строке, добавляя каждый символ к securestring с помощью метода AppendChar.
нет фантазии linq, не добавляя все символы вручную, просто и просто:
var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
если вы хотите сжать преобразование 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
to SecureString
. Пока оригинал string
остается в памяти данные уязвим.
это, как говорится, то, что может предложить вышеупомянутое заявление, держится вместе создание SecureString
, его инициализация с данными и, наконец, блокировка от модификации.
следующие 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; }
спасибо Джона Дэгг на AppendChar
рекомендации.
вы можете использовать этот простой скрипт
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
Я просто хочу указать всем людям, говорящим: "дело не в этом!--0-->", что многие из людей, задающих этот вопрос, могут быть в приложении, где по какой-либо причине оправданы или нет, они не особенно беспокоится о том, что временная копия пароля сидит в куче как строка GC-able, но они должны использовать API, который только принимает SecureString
объекты. Итак, у вас есть приложение, где вы не уход ли пароль находится в куче, возможно, это только внутреннее использование, и пароль существует только потому, что это требуется базовыми сетевыми протоколами, и вы обнаружите, что эта строка, в которой хранится пароль, не может быть использована, например, для настройки удаленного пространства запуска PowerShell, но нет простого, прямого однострочного создания этого SecureString
что вам нужно. Это небольшое неудобство - но, вероятно, стоит того, чтобы убедиться, что приложения, которые действительно do нужно SecureString
Не искушай авторы использовать System.String
или System.Char[]
посредников. :-)
более простой подход, который можно использовать:
# Take password and convert it to a secure string
$mySS = "MyCurrentPassword" | ConvertTo-SecureString -AsPlainText -Force