[英]“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”沒有什么特別之處,你不能用任何其他方法用任何其他名稱來做。 許多人相信以下神話:
這些神話都不是真的。
事實是:
完成 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.