Ответ 1
Вы можете использовать Linq:
"fizzbuzz".ToCharArray ().ToList ().ForEach ( p => secureString.AppendChar ( p ) );
Можно ли это упростить для одного лайнера? Не стесняйтесь полностью переписать его, если secureString правильно инициализируется.
SecureString secureString = new SecureString ();
foreach (char c in "fizzbuzz".ToCharArray())
{
secureString.AppendChar (c);
}
Вы можете использовать Linq:
"fizzbuzz".ToCharArray ().ToList ().ForEach ( p => secureString.AppendChar ( p ) );
Просто используйте NetworkCredential. Он имеет встроенную логику преобразования.
SecureString ss = new NetworkCredential("", "fizzbuzz").SecurePassword;
Как отмечали другие, все эти технологии ограничивают безопасность SecureString, но в определенных ситуациях (например, модульные тесты) это может быть приемлемым.
Update:
Как отмечено в комментариях, NetworkCredential также может использоваться для преобразования SecureString в строку.
string s = new NetworkCredential("", ss).Password;
Помимо использования небезопасного кода и char*
, нет лучшего способа.
Дело здесь не в том, чтобы копировать содержимое SecureString в/из обычных строк. Постоянная "fizzbuzz"
- это утечка безопасности.
Небольшое улучшение ответа Sascha, заменяющего лямбда группой методов
"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);
var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });
Вот как класс NetworkCredential от .NET делает это:
SecureString secureString;
fixed (char* chPtr = plainString)
secureString = new SecureString(chPtr, plainString.Length);
Уродливый, но, вероятно, самый эффективный.
Так как 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);
}
}
Следующая статья также предоставит вам дополнительную информацию.