49

これをワンライナーに単純化できますか? secureString が適切に初期化される限り、自由に完全に書き直してください。

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

8 に答える 8

49

Linq を使用できます。

"fizzbuzz".ToCharArray().ToList().ForEach(p => secureString.AppendChar(p));
于 2010-03-10T20:06:47.343 に答える
29

安全でないコードと を使用する以外にchar*、(はるかに) 良い方法はありません。

ここでのポイントは、SecureString の内容を通常の文字列との間でコピーしないことです。一定の"fizzbuzz"定数は、ここでのセキュリティ リークです。

于 2010-03-10T20:06:18.687 に答える
17

ラムダをメソッドグループに置き換えるSaschaの回答のわずかな改善

"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);
于 2011-08-19T12:55:47.553 に答える
17
var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });
于 2011-07-18T23:52:04.640 に答える
9

インターフェイス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);
     }
}

次の記事では、いくつかの追加情報も提供します。

于 2014-01-20T01:41:11.620 に答える