Подтвердить что ты не робот

Использование SecureString

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

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

Ответ 1

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

"fizzbuzz".ToCharArray ().ToList ().ForEach ( p => secureString.AppendChar ( p ) );

Ответ 2

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

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

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

Update:

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

string s = new NetworkCredential("", ss).Password;

Ответ 3

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

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

Ответ 4

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

"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);

Ответ 5

var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });

Ответ 6

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

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

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

Ответ 7

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

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

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

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

Update:

Фактически вы можете сделать полную подпись метода:

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

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