2017-07-30 13 views
1

私はCryptoStreamの下にStreamを持っています。私はCryptoStreamを処分するためにusingブロックを使用することはできません。その理由は、それが開かなければならない基礎的なStreamを処分するためです。解決方法は単にCryptoStreamを無視して、必要なときにはStreamを処分するだけです。しかしおそらく、CryptoStreamへの参照を保持し、リソースの漏洩を防ぐためにそれを処分することは重要ですか?CryptoStreamを破棄して、元のストリームを破棄しますか?

また、私はCryptoStreamを配置していない場合でも、かもしれない、それはスコープの外に出ると、その後も基礎となるStreamを処分した場合、それのGCの処分、(私はまだStreamを必要とするので、あまりにも早くなりますか)?

+0

基本ストリームを開いたままにする必要がありますか?なぜなら、このように設計されていたからです。 –

+0

最も安全な方法は、memorystreamを暗号化し、暗号化ストリームを破棄した後にそのバッファを使用することです。小さいデータを推薦する。 –

+0

@HenkHoltermanはい。ストリームの一部をハッシュし、ハッシュCryptoStreamなしで残りの部分を処理し続ける必要があります。 – ispiro

答えて

1

CryptoStream.cs (ln 695)から:

protected override void Dispose(bool disposing) { 
     try { 
      if (disposing) { 
       if (!_finalBlockTransformed) { 
        FlushFinalBlock(); 
       } 
       _stream.Close(); 
      }     
     } 
     finally { 
      try { 
       // Ensure we don't try to transform the final block again if we get disposed twice 
       // since it's null after this 
       _finalBlockTransformed = true; 
       // we need to clear all the internal buffers 
       if (_InputBuffer != null) 
        Array.Clear(_InputBuffer, 0, _InputBuffer.Length); 
       if (_OutputBuffer != null) 
        Array.Clear(_OutputBuffer, 0, _OutputBuffer.Length); 

       _InputBuffer = null; 
       _OutputBuffer = null; 
       _canRead = false; 
       _canWrite = false; 
      } 
      finally { 
       base.Dispose(disposing); 
      } 
     } 
    } 

あなたはあなたがCryptoStreamを配置したくない場合は、公開されFlushFinalBlockメソッドを呼び出す必要が見ることができるように。この方法は、入力バッファと出力バッファをクリアして、使用されているCryptoStreamに機密情報が格納されないようにします。

GCが下位のStreamを閉じる可能性がありますか?いいえ。これを行うには、メソッドを引数値としてtrueで呼び出す必要がありますが、これはStream.Closeメソッド(Stream.Disposeから呼び出されます)でのみ行われます。 CryptoStreamがファイナライザを実装する場合でも、Finalizeを実行するときには、参照されたオブジェクトに対してDisposeを呼び出すことはお勧めできません。ファイナライザは、アンマネージリソースを解放する目的でのみ使用してください。

関連する問題