2016-09-12 9 views
6

私はセキュリティ関連のプログラムを作っています。私はこれを正しい方法で実行していることを確認したいと思います。誰かがパスワードでログインすると、秘密鍵が復号化され、変数に格納されます。彼らがログアウトすると、その秘密鍵のメモリ内のデータが完全に消去され、削除されたとマークされるだけではありません。私は現在、次のことをやっている:これは完全にシステムから秘密鍵(_phraseHash)を消去するのに十分であるならば、私が知りたいのは何C#安全に変数をメモリから削除する

public void Logout() 
{ 
    RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider(); 
    for (var i = 0; i < 3; i++) 
    { 
     byte[] data = new byte[(int) Math.Round((double) (_phraseHash.Count()))]; 
     rngCsp.GetBytes(data); 
     int randomNum = BitConverter.ToInt32(data, 0); 
     _phraseHash = randomNum.ToString(); 
    } 
    LoggedIn = false; 
    _phraseHash = null; 
} 

です。

これも必要ですか?私は実際にメモリ内のデータがどのように削除されているかについてはあまり知らないのですが、何か他の領域が必要なときにバイトが削除され、書き換えられたハードドライブの動作と多少似ていると仮定しました。

+5

パスワードを保存するのに[SecureString](https://msdn.microsoft.com/en-us/library/system.security.securestring(v = vs.110).aspx)を使用しないのはなぜですか? – 3615

+0

通常、データを破棄するために承認された方法は、データを5回、すべての0、次にすべて1で上書きします。 – jdweng

+0

値をnullに設定しても、データはメモリに残っているため、実際には助けにはなりません。ポインタはポインティングを止めるだけです。メモリをクリアしたい場合は、何回かランダムなデータで数回上書きし、ガベージコレクタを強制的に動作させてください( 'GC.Collect()') - GCは値をnullに設定した直後に動作しません。 –

答えて

8

私はあなたのプログラムでガベージコレクションのためにスケジュールすることはできませんSystem.Stringクラスのインスタンスは、不要になったときに、不変と両方あるSecureString

に興味を持つかもしれないと思います。つまり、インスタンスは作成後に読み取り専用になり、インスタンスがいつコンピュータメモリから削除されるかを予測することはできません。 System.Stringインスタンスは不変なので、既存のインスタンスを変更するように見える操作では、実際に操作するコピーが作成されます。したがって、Stringオブジェクトにパスワード、クレジットカード番号、個人データなどの機密情報が含まれていると、アプリケーションがコンピュータのメモリからデータを削除できないため、情報を使用した後に情報が漏洩する危険性があります。

SecureStringオブジェクトは、テキスト値が である点でStringオブジェクトに似ています。ただし、SecureStringオブジェクトの値は メモリに固定されています。暗号化などの保護メカニズムを使用する可能性があります。 は基本オペレーティングシステムで、 アプリケーションは読み取り専用とマークして削除するまで修正できますアプリケーションからDisposeメソッドを呼び出すか、 .NET Frameworkガベージコレクタによってコンピュータ のメモリから削除します。

+2

これは興味深い記事です:[SecureStringはどのように安全ですか?](https://msdn.microsoft.com/en-us/library/system.security.securestring%28v=vs.110%29.aspx?f = 255&MSPPError = -2147217396#HowSecure) – TaW

+0

ありがとう、私はこれが私の質問に答えると思います。私は一度それを成功させるとそれをそのようにマークします。 – Hephaestious

+0

私はSecureStringを使用しようとしましたが、文字列と互換性がないので、使用するために、暗号化クラスのすべての文字列を置き換えて、securestring - > byte配列のサポートを追加する必要がありました。何か案は? – Hephaestious

関連する問題