從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
也不是好習慣。終結器應該僅用於釋放非託管資源。
你確定你需要基礎流保持打開嗎?因爲它是這樣設計的。 –
最安全的方法是在處理cryptostream之後加密到內存流並使用其緩衝區。建議少量數據。 –
@HenkHolterman是的。我需要散列一些流,並繼續處理其餘的沒有散列CryptoStream。 – ispiro