Преобразование строки в 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 to String
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
toSecureString
. Пока оригинал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; }
Я просто хочу указать всем людям, говорящим: "это не суть
SecureString
", что многие из людей, задающих этот вопрос, могут быть в приложении, где по какой-либо причине, оправданной или нет, они не особенно обеспокоены тем, что временная копия пароля сидит в куче как строка GC-able, но они должны использовать API, который только принимаетSecureString
объекты. Итак, у вас есть приложение, где вы не уход ли пароль находится в куче, возможно, это только внутреннее использование, и пароль только там, потому что он требуется базовыми сетевыми протоколами, и вы обнаружите, что эта строка, где хранится пароль, не может использоваться, например, для настройки удаленного пространства запуска PowerShell - но нет простого, прямого однострочного создания этогоSecureString
что вам нужно. Это незначительное неудобство - но, вероятно, стоит того, чтобы убедиться, что приложения, которые действительно do нужноSecureString
Не искушай авторы использоватьSystem.String
илиSystem.Char[]
посредников. : -)