セキュリティ上の理由から、C# 文字列のメモリ コンテンツをクリアしようとしています。クラスは認識してSecureString
いますが、残念ながら自分のアプリケーションではSecureString
代わりに使用できません。String
クリアする必要がある文字列は、実行時に動的に作成されます (たとえば、文字列リテラルをクリアしようとしていません)。
私が見つけたほとんどの検索結果は、基本的に a の内容をクリアすることString
は不可能であり (文字列は不変であるため)、SecureString
使用する必要があると述べています。
したがって、以下の独自の解決策 (安全でないコードを使用) を考え出しました。テストでは解決策が機能することが示されていますが、解決策に何か問題があるかどうかはまだわかりませんか? より良いものはありますか?
static unsafe bool clearString(string s, bool clearInternedString=false)
{
if (clearInternedString || string.IsInterned(s) == null)
{
fixed (char* c = s)
{
for (int i = 0; i < s.Length; i++)
c[i] = '\0';
}
return true;
}
return false;
}
編集: GC に関するコメントが呼び出される前に文字列を移動するためclearString
: 次のスニペットはどうですか?
string s = new string('\0', len);
fixed (char* c = s)
{
// copy data from secure location to s
c[0] = ...;
c[1] = ...;
...
// do stuff with the string
// clear the string
for (int i = 0; i < s.Length; i++)
c[i] = '\0';
}