Использование SecureString - PullRequest
47 голосов
/ 10 марта 2010

Можно ли это упростить до одного лайнера? Не стесняйтесь полностью переписать его, пока secureString правильно инициализируется.

SecureString secureString = new SecureString ();
foreach (char c in "fizzbuzz".ToCharArray())
{
    secureString.AppendChar (c);
}

Ответы [ 8 ]

47 голосов
/ 22 июня 2012

Просто используйте NetworkCredential. Имеет встроенную логику преобразования.

SecureString ss = new NetworkCredential("", "fizzbuzz").SecurePassword;

Как уже отмечалось, все эти методы лишают преимущества безопасности SecureString, но в определенных ситуациях (например, модульных тестах) это может быть приемлемым.

Обновление:

Как отмечено в комментариях, NetworkCredential также можно использовать для преобразования SecureString обратно в строку.

string s = new NetworkCredential("", ss).Password;
46 голосов
/ 10 марта 2010

Вы можете использовать Linq:

"fizzbuzz".ToCharArray ().ToList ().ForEach ( p => secureString.AppendChar ( p ) );
26 голосов
/ 10 марта 2010

Помимо использования небезопасного кода и char*, лучшего способа не существует (*).

Смысл здесь не в том, чтобы копировать содержимое SecureString в / из обычных строк. Постоянная "fizzbuzz" постоянная здесь утечка безопасности.

16 голосов
/ 19 августа 2011

Незначительное улучшение в ответе Саши, заменив лямбду группой методов

"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);
14 голосов
/ 19 июля 2011
var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });
8 голосов
/ 18 декабря 2013

Вот как класс NetworkCredential из .NET делает это:

SecureString secureString;
fixed (char* chPtr = plainString)
  secureString = new SecureString(chPtr, plainString.Length);

Гадкий, но, вероятно, самый эффективный.

5 голосов
/ 20 января 2014

Поскольку SecureString использует интерфейс IDispose. Вы могли бы сделать это так.

SecureString secure = new SecureString();
foreach(var character in data.ToCharArray())
    secure.AppendChar(character);

По существу, data будет параметром.

Если вы используете using, чтобы помочь облегчить ресурсы; Вы хотите быть осторожными в сфере. Но это может быть выгодной альтернативой, в зависимости от использования.

Обновление:

Вы могли бы сделать полную сигнатуру метода:

public static SecureString ConvertStringToSecureString(this string data)
{
     var secure = new SecureString()
     foreach(var character in data.ToCharArray())
         secure.AppendChar(character);

     secure.MakeReadOnly();
     return secure;

}

Для расшифровки вы хотели бы сделать:

public static string ConvertSecureStringToString(this SecureString data)
{
     var pointer = IntPtr.Zero;
     try
     {
          pointer = Marshal.SecureStringToGlobalAllocUnicode(data);
          return Marshal.PtrToStringUni(pointer);
     }
     finally
     {
          Marshal.ZeroFreeGlobalAllocUnicode(pointer);
     }
}

Следующая статья также предоставит вам дополнительную информацию.

3 голосов
/ 02 марта 2018

минимальное количество кода, потому что .ToList() для этого не требуется:

Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...