web-dev-qa-db-ja.com

SecureStringを使用する

これを1つのライナーに単純化できますか? secureStringが適切に初期化される限り、完全に書き換えてください。

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

Linqを使用できます。

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

NetworkCredentialを使用するだけです。変換ロジックが組み込まれています。

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

他の人が指摘したように、これらの手法はすべてSecureStringのセキュリティ上の利点を取り除きますが、特定の状況(単体テストなど)ではこれが許容される場合があります。

更新:

コメントに記載されているように、NetworkCredentialを使用してSecureStringを文字列に戻すこともできます。

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

安全でないコードとchar*、より良い方法はありません。

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

26
Henk Holterman

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

"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);
16
Peter Kelly
var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });
14
Kevin

次に、.NETのNetworkCredentialクラスがそれを実行する方法を示します。

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

Glyいですが、おそらく最も効率的です。

8
Boris Lipschitz

SecureStringIDisposeインターフェイスを使用するため。実際にこのようにすることができます。

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

次の 記事 は、追加情報も提供します。

5
Greg

これには.ToList()が必要ないため、コードの量が最小になります。

Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);
3