2009-10-15 2 views

ответ

83

У вас нет. Вся причина использования объекта 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'); 
+18

Не забудьте сделать это только для чтения s.MakeReadOnly(); – ysrb

+3

«Комбинация' 12345' ... это то, что идиот имеет в своем багаже! » –

+0

Все, что я вижу, это '*****' –

4

Я выброшу это. Зачем?

Вы не можете просто изменить все свои строки, чтобы защитить строки, и внезапно ваше приложение «безопасно». Защищенная строка предназначена для того, чтобы держать строку зашифрованной как можно дольше и только расшифровываться в течение очень короткого периода времени, вытирая память после выполнения операции над ней.

Я бы сказал, что у вас могут возникнуть проблемы с уровнем дизайна, прежде чем беспокоиться о защите строк приложения. Дайте нам дополнительную информацию о том, что вы пытаетесь сделать, и мы сможем помочь лучше.

+1

Я просто хочу, чтобы использовать его, чтобы установить пароль для ProcessStartInfo и запустить свой ехе, как другой пользователь. Это работало для меня ... – Nila

+2

Мое приложение защищено, запустив его в защищенной системе. Мне было все равно, что эта строка будет зашифрована в памяти. Есть гораздо более важные сведения об этой системе, о которых нужно беспокоиться, если они когда-либо будут скомпрометированы. SecureString просто требуется Microsoft API, который моя программа должна использовать. Подразумевается, что разработчик рассматривает свой собственный прецедент и определяет, является ли преобразование строк в SecureStrings действительной операцией в контексте. – Dan

3

Я согласен с Спенс (+1), но если вы делаете это для обучения или тестирования pourposes, вы можете использовать Еогеасп в строке, добавляя каждый символ в SecureString с использованием метода AppendChar ,

39

ниже метод позволяет преобразовать строку в защищенную строку

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; 
} 
+11

+1, но обратите внимание, что передача пароля в виде строкового параметра создает незашифрованный экземпляр строки в управляемой памяти и в первую очередь побеждает цель «SecureString». Просто указывая это на будущих людей, которые приходят и используют этот код. – Cody

+5

@Cody Это правда, и хороший момент, но многие из нас не заботятся, безопасно ли SecureString или нет, и используют его только потому, что некоторые Microsoft API требуют его в качестве параметра. – Dan

11

Вы можете следить за этим:

string password = "test"; 
SecureString sec_pass = new SecureString(); 
Array.ForEach(password.ToArray(), sec_pass.AppendChar); 
sec_pass.MakeReadOnly(); 
6
unsafe 
{ 
    fixed(char* psz = password) 
     return new SecureString(psz, password.Length); 
} 
5

Вот это дешевый трюк 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(); 
+11

Этот ответ показывает, сколько временных копий простого текста может быть сгенерировано за один выстрел –

2

Если вы хотите, чтобы сжать превращение 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, его инициализацию данными и, наконец, блокировку его от модификации.

3

нет фантазии LINQ, не добавляя все символы вручную, просто и просто:

var str = "foo"; 
var sc = new SecureString(); 
foreach(char c in str) sc.appendChar(c); 
+0

даже fancier, нет необходимости определять переменную – bigworld12

+0

вот один лайнер: 'var sc = new SecureString(); foreach (char c in "foo") sc.appendChar (c); ' – bigworld12

44

Существует также другой способ преобразования между SecureString и String.

1. Строка SecureString

SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword; 

2.SecureString в строку

string theString = new NetworkCredential("", theSecureString).Password; 

Вот это link

+1

Это лучшее решение для наиболее распространенного случая использования! – Dan

+3

Нет смысла использовать «SecureString», если ваш код создает объект 'string' со значением, которое вы хотите защитить. Цель «SecureString» заключается в том, чтобы не содержать строку в управляемой памяти, поэтому злоумышленник, изучающий эту память, может определить значение, которое вы хотите скрыть. Поскольку конструктор 'NetworkCredential', который вы вызываете, требует строки, это не путь ... Конечно, ваш код - это простой способ конвертировать в SecureString и из него, но использование этого кода делает ваш код безопасным, как простой 'string' –

0

Следующие 2 расширения должны сделать трюк:

  1. Для char массива

    public static SecureString ToSecureString(this char[] _self) 
    { 
        SecureString knox = new SecureString(); 
        foreach (char c in _self) 
        { 
         knox.AppendChar(c); 
        } 
        return knox; 
    } 
    
  2. И для 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 рекомендации.

2

вы можете использовать этот простой сценарий

private SecureString SecureStringConverter(string pass) 
{ 
    SecureString ret = new SecureString(); 

    foreach (char chr in pass.ToCharArray()) 
     ret.AppendChar(chr); 

    return ret; 
} 
+0

Этот ответ [был размещен 15 месяцев назад] (https://stackoverflow.com/a/38326325/11683). На самом деле не было необходимости публиковать его снова. – GSerg

0

Простейшее подход, который может быть использован:

# Take password and convert it to a secure string 
$mySS = "MyCurrentPassword" | ConvertTo-SecureString -AsPlainText -Force 
Смежные вопросы