2017-02-10 8 views
-1

.NETアプリケーションのメモリから文字列を削除したいと思います。 私たちは第三者libから来て、Stringを返すDecryptionメソッドを持っているとしましょう。これはスマートではありませんが、私はそれについて何もできません。文字列の内容を削除する

String s = SomeComponent.Decrypt("cypherstring") 

今、私はで動作するようにSecureStringsの内容をコピーします。しかし...どうすればsを取り除くことができますか?私はGCがここでそれを集めることを知っていますが、私はその文字列をしばらく使っていればそれは残るでしょう。また、ここではGCに依存しないようにしたいと思っています。なぜなら、セキュリティに関連している可能性があるからです。

私の考えは、そのようなものです:

public static SecureString Convert(ref String s) 
{ 
    //copy content of s into SecureString 
    //shred s 
} 

ありSecureStringにデータをコピーするには大したはありませんが、どのように私はSを「破壊」しますか?

+0

なぜそれはより安全にコピーすると思いますか?すでに出力がコピーされている新しい文字列を作成しました。そして、コードで再度使用されないとすぐにGC'dを取得します。ローカル変数の場合、GC'dはかなり速くなります。 – EpicKip

+0

あなたが望むことをするために 'Marshall.DestroyStructure'と' Marshall.FreeHAlloc'の組み合わせを使うことができますし、 'GC.Collect'でも核実験をすることができますが、EpicKipにはおそらく必要ではない、特にローカル変数の場合は特にそうです。 – Abion47

+0

データをもう読み込めないようにするには、少なくともsを別の値に設定することができます。したがって、現時点でGCによって処理されていない場合でも、元の文字列の内容は残っていません – Pedro

答えて

0

使用このコード:

public static SecureString Convert(ref String s) 
{ 
    //copy content of s into SecureString 
    SecureString secureString; 
    unsafe 
    { 
     fixed (char* charArray = s.ToArray()) 
      secureString = new SecureString(charArray, s.Length); 
    }    
    //shred s 
    s = null; 
    GC.Collect(); 
    return secureString; 
} 

なお、文字列はSecureStringの最大容量を超えることができない場合は、長さ。 SecureStringの最大容量は65536です

+2

これはおそらく動作しません。 MSDNより: "このメソッドを使用してアクセスできないメモリを再利用しようとしますが、このメソッドを使用しても、指定された世代のすべてのアクセスできないメモリが再利用されることは保証されません。" – Gordon

+0

他の質問で述べたように、以前のGCで「移動」されているため、この文字列のコピーがヒープ内の(現在は使用されていない)メモリに何回コピーされたのか分かりません(もちろん、GC中に "移動"と言うと、実際に何を意味するのかはコピーされ、参照が更新されます。GCは(意図的に)以前のメモリ位置を消去するために何もしません) –

関連する問題