";最后尝试";块与"块";使用";在处理SymmetricAlgor

本文关键字:quot SymmetricAlgor 使用 处理 最后 块与 | 更新日期: 2023-09-27 18:00:55

根据System.Security.Cryptography.SymmetricAlgorithm 的msdn文档

请注意,在使用派生类时,从安全角度来看,仅仅在使用完对象后强制进行垃圾收集是不够的。必须对对象显式调用Clear方法,以便在释放对象之前将对象中的任何敏感数据清零。请注意,垃圾回收不会将收集对象的内容清零,而是简单地将内存标记为可用于重新分配。因此,垃圾收集对象中包含的数据可能仍然存在于未分配内存中的内存堆中。在加密对象的情况下,这些数据可能包含敏感信息,如密钥数据或纯文本块。

.NET Framework中所有保存敏感数据的加密类都实现了Clear方法。调用时,Clear方法会用零覆盖对象中的所有敏感数据,然后释放对象,以便可以安全地对其进行垃圾收集。当对象为零并释放后,应调用Dispose方法,并将Dispose参数设置为True,以处置与该对象关联的所有托管和非托管资源。

我从中得到的是,我必须使用tryfinally块来处理我的算法,就像这样:

SymmetricAlgorithm symmetricAlgorithm = SymmetricAlgorithm.Create()
try 
{
     //stuff
}
finally
{
    symmetricAlgorithm.Clear();
    symmetricAlgorithm.Dispose(true)
}

我无法使用更简洁的using

using (var symmetricAlgorithm = SymmetricAlgorithm.Create())
{
    //do stuff
}

因为它不会清除记忆。它只会将其标记为收藏。这是正确的吗?谢谢你的帮助。

";最后尝试";块与"块";使用";在处理SymmetricAlgor

[调用Dispose]只会将其标记为集合。这是正确的吗?

不,这是不对的。您对"Dispose"的作用有误解。这是一个非常常见的误解。

让我非常清楚这一点:"Dispose"本身与垃圾收集完全无关"Dispose"没有什么特别之处,在任何其他名称的方法中都无法做到。许多人相信以下神话:

  • 对实现名为IDisposable的接口的对象调用名为Dispose的方法会"标记"要收集的对象
  • 垃圾收集器在收集对象时调用IDisposable.Dispose

这两个神话都不是真的。

事实是:

  • 在处理完对象时调用"Dispose"是一种约定,旨在确保在垃圾收集器清理与对象关联的托管内存资源之前,非托管资源

  • 垃圾收集器仅根据是否可以通过已知的活动对象访问对对象的任何引用来决定何时收集对象。调用"Dispose"或任何其他方法都不会使对象不可访问。

  • 垃圾收集器(有时(会在对象被收集之前不久对其调用"终结器"(也称为"析构函数"(。按照惯例,对象的作者通常会选择将对象的定稿与其处置方式相同。不过,这只是一个惯例。

  • 按照惯例,刚被处理的对象应该告诉垃圾收集器,当这个对象最终变得不可访问时,GC可以安全地跳过它的终结。

"Dispose"只是一种方法。如果该方法碰巧告诉GC一堆东西,比如"顺便说一句,有人已经负责完成这个对象",该方法可以自由地这样做。"Dispose"没有固有的魔力。你可以写你自己的方法"MyDispose"和你自己的接口"IMyDisposable",做同样的事情;GC既不知道也不关心您选择了什么约定来组织代码,从而提前释放非托管资源。

以下是Clear方法的实现方式(来自Reflector(:

public void Clear()
{
    ((IDisposable) this).Dispose();
}

因此您可以使用using块。