处置CryptoStream vs处理底层Stream?

时间:2017-07-30 15:51:56

标签: c# .net encryption stream garbage-collection

我有一个基础为CryptoStream的{​​{1}}。我无法使用Stream块来处置using,因为它还会释放我需要保持打开的基础CryptoStream。解决方案似乎只是忽略Stream,只需在需要时处理CryptoStream。但也许重要的是保持对Stream的引用并处理它以防止一些资源泄漏?

此外,即使我没有处置CryptoStream,如果GC超出范围,GC也可以处置它,然后处理基础CryptoStream,(因为我太早了)还需要Stream)吗?

1 个答案:

答案 0 :(得分: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吗?不。为此,必须使用Dispose作为参数值调用true方法,但这仅在Stream.Close方法(从Stream.Dispose调用)中完成。即使CryptoStream实现终结器,在执行Dispose时对引用的对象调用Finalize也不是一个好习惯。终结者应仅用于释放非托管资源。