2017-07-30 125 views
1

我有一個CryptoStream與底層Stream。我不能使用using區塊來處置CryptoStream,因爲這也會處理我需要打開的底層Stream。解決方案似乎只是簡單地忽略CryptoStream,並在需要時僅處置Stream。但是,保留對CryptoStream的引用並處理它以防止某些資源泄漏也許很重要?處理CryptoStream vs處理底層Stream?

此外,即使我不處置CryptoStream可能它的GC處置,如果超出範圍,然後同時處理底層Stream,(這將是太早了,因爲我仍然需要Stream)?

+0

你確定你需要基礎流保持打開嗎?因爲它是這樣設計的。 –

+0

最安全的方法是在處理cryptostream之後加密到內存流並使用其緩衝區。建議少量數據。 –

+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); 
      } 
     } 
    } 

正如你可以看到你應該調用FlushFinalBlock方法是公共的,如果你不想處理一個CryptoStream。此方法清除輸入和輸出緩衝區,因此在使用的CryptoStream中不存儲敏感信息。

GC可能會關閉底層的Stream?不。爲此,必須使用true作爲參數值調用Dispose方法,但這隻能在Stream.Close方法(從Stream.Dispose調用)中完成。即使CryptoStream將實現終結器,在執行Finalize時,在引用的對象上調用Dispose也不是好習慣。終結器應該僅用於釋放非託管資源。