Преобразование строки в SecureString


Как преобразовать String до SecureString?

14 74

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

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

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

Я просто хочу указать всем людям, говорящим: "это не суть SecureString", что многие из людей, задающих этот вопрос, могут быть в приложении, где по какой-либо причине, оправданной или нет, они не особенно обеспокоены тем, что временная копия пароля сидит в куче как строка 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