2011-01-04 9 views
3

私はC#ライブラリとそれを使用するWPFアプリケーションを試してみました。平文の文字列パスワードをSecureStringに置き換えようとしています。私はSecureStringを他のライブラリ/ Webサービスとやりとりするためのいくつかの場所で通常の文字列に変換し直す必要がありますが、それを行う量を最小限に抑えたいと思っています。私はまたそれを正しく行う方法についてthis articleに従おうとしています。どのような文字列が自分のコードからメモリ内に浮かんでいるかを監視する簡単な方法はありますか?どのくらいの弱点があるのか​​を知りたいのですが、言い換えれば、機密データがメモリ上のプレーンテキストにあるという点では私のコードにあります。私のWPFアプリケーションとC#ライブラリから機密データを読み取る

答えて

2

あなたが確認できることの1つは、プレーンテキストのパスワードがライブラリーによって維持されている場合、弱い参照を追加してそれが消えるまでにかかる時間を確認することです。強制的なガベージコレクトを実行するのに役立つかどうかを確認することができます。しかし、生産コードでは、特にサーバー上で強制GCを実行しないでください。

しかし、それは問題の半分に過ぎません。ほとんどの場合、他のライブラリがあなたの文字列で行うことに依存します。パスワードを他の文字列に埋め込み、それを参照し続けると、パスワードを制御することなくメモリが保護されなくなります。

+0

私のテストパスワードが "pass123"だった場合、WeakReference(http://msdn.microsoft.com/en-us/library/system.weakreference(v=VS.90).aspx)を " pass123 "、そして文字列が.NETで不変なので、他のコードで" pass123 "を使用している場合... WeakReferenceで何をしますか?デバッガに時計を入れますか? –

+1

はい、それは一般的なアイデアです。ライブラリ呼び出しの後、弱参照の文字列にrefを置き、元の文字列refをnullに設定します。そして、強制的にグローバルなGCがそれを消してしまう場合に試してみることができます。もしそれが消えてしまったら、図書館はあなたの秘密の文字列を少なくとも確実に生きていないと知っています。次のステップは、あなたの文字列がガベージコレクションされるまでにどれくらいの時間がかかるかを、デバッグビルドでテストすることです。あなたは弱点を守って、ターゲットがヌルになるときをチェックします。 –

+1

一般に、最初に文字列を長くしておくと、それ以降に収集されるまでの時間が長くなります。あなたのAPIコールが長い時間がかかったり、GCが頻繁にトリガされたりすると、.netはあなたの文字列が長続きすると判断し、完全なGCが発生した場合にのみ破棄します。 GUIアプリケーションでは、たとえば自分のアプリがアイドル状態になったときなど、自分自身を起動させることができます。 –

関連する問題