これを1つのライナーに単純化できますか? 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のセキュリティ上の利点を取り除きますが、特定の状況(単体テストなど)ではこれが許容される場合があります。
更新:
コメントに記載されているように、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; });
次に、.NETのNetworkCredentialクラスがそれを実行する方法を示します。
SecureString secureString;
fixed (char* chPtr = plainString)
secureString = new SecureString(chPtr, plainString.Length);
Glyいですが、おそらく最も効率的です。
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);
}
}
次の 記事 は、追加情報も提供します。
これには.ToList()
が必要ないため、コードの量が最小になります。
Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);