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

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


unsafe 
{
    fixed(char* psz = password)
        return new SecureString(psz, password.Length);
}

вот дешевый трюк 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 расширения должны сделать трюк:

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

спасибо Джона Дэгг на 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