簡體   English   中英

處理 SymmetricAlgorithm 時的“try-finally”塊與“使用”塊

[英]“try-finally” block vs. “using” block when disposing of SymmetricAlgorithm

根據System.Security.Cryptography.SymmetricAlgorithm 的 msdn 文檔

請注意,在使用派生類時,從安全角度來看,在您使用完 object 之后簡單地強制進行垃圾回收是不夠的。 您必須在 object 發布之前顯式調用 object 上的 Clear 方法以清零 object 中的任何敏感數據。 請注意,垃圾收集不會將收集到的對象的內容清零,而只是將 memory 標記為可用於重新分配。 因此,垃圾收集 object 中包含的數據可能仍存在於未分配 memory 的 memory 堆中。 對於加密對象,此數據可能包含敏感信息,例如密鑰數據或純文本塊。

.NET 框架中保存敏感數據的所有加密類都實現了 Clear 方法。 調用時,Clear 方法會用零覆蓋 object 中的所有敏感數據,然后釋放 object 以便可以安全地對其進行垃圾收集。 當 object 被清零並釋放后,您應該調用 Dispose 方法並將 disposing 參數設置為 True 以釋放與 object 關聯的所有托管和非托管資源。

我從中得到的是我必須使用 try-finally 塊來處理我的算法,如下所示:

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

我將無法使用更簡潔的using

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

因為它不會清除 memory。 它只會將其標記為收集。 那是對的嗎? 謝謝您的幫助。

[調用 Dispose] 只會將其標記為收集。 那是對的嗎?

不,這是不正確的。 您對“處置”的作用有誤解。 這是一個很常見的誤解。

讓我在這一點上非常清楚: “處理”本身與垃圾收集完全無關。 “Dispose”沒有什么特別之處,你不能用任何其他方法用任何其他名稱來做。 許多人相信以下神話:

  • 在實現名為 IDisposable 的接口的 object 上調用名為 Dispose 的方法“標記”object 進行收集。
  • 垃圾收集器在收集 object 時調用 IDisposable.Dispose。

這些神話都不是真的。

事實是:

  • 完成 object 后調用“Dispose”是一種約定,旨在確保在垃圾收集器開始清理與 ZA8CFDE6331BD59EB62AC96F8911CB4 關聯的托管 memory 資源之前清理非托管資源

  • 垃圾收集器僅根據對 object 的任何引用是否可通過已知的活動 object 訪問來決定何時收集 object。 調用“Dispose”或任何其他方法都不會使 object 無法訪問。

  • 垃圾收集器將(有時)在收集之前不久在 object 上調用“終結器”(也稱為“析構函數”)。 作為慣例,object 的作者通常選擇讓 object 的最終確定與其處置相同。 但同樣,這只是一個約定。

  • 按照慣例,剛剛處理的 object 應該告訴垃圾收集器,當 object 最終變得無法訪問時,GC 可以安全地跳過該 object 的終結。

“處置”只是一種方法。 如果那個方法碰巧告訴 GC 一堆東西,比如“順便說一句,有人已經完成了這個對象的終結”,那么這個方法可以自由地這樣做。 “Dispose”沒有內在的魔力。 你可以編寫你自己的方法“MyDispose”和你自己的接口“IMyDisposable”來做同樣的事情; GC 既不知道也不關心您選擇了哪些約定來組織代碼,以便盡早釋放非托管資源。

以下是 Clear 方法的實現方式(來自 Reflector):

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

所以你可以使用using塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM