私はセキュリティ関連のプログラムを作っています。私はこれを正しい方法で実行していることを確認したいと思います。誰かがパスワードでログインすると、秘密鍵が復号化され、変数に格納されます。彼らがログアウトすると、その秘密鍵のメモリ内のデータが完全に消去され、削除されたとマークされるだけではありません。私は現在、次のことをやっている:これは完全にシステムから秘密鍵(_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;
}
です。
これも必要ですか?私は実際にメモリ内のデータがどのように削除されているかについてはあまり知らないのですが、何か他の領域が必要なときにバイトが削除され、書き換えられたハードドライブの動作と多少似ていると仮定しました。
パスワードを保存するのに[SecureString](https://msdn.microsoft.com/en-us/library/system.security.securestring(v = vs.110).aspx)を使用しないのはなぜですか? – 3615
通常、データを破棄するために承認された方法は、データを5回、すべての0、次にすべて1で上書きします。 – jdweng
値をnullに設定しても、データはメモリに残っているため、実際には助けにはなりません。ポインタはポインティングを止めるだけです。メモリをクリアしたい場合は、何回かランダムなデータで数回上書きし、ガベージコレクタを強制的に動作させてください( 'GC.Collect()') - GCは値をnullに設定した直後に動作しません。 –