2012-04-11 63 views
4

當生成對稱密鑰來加密消息時,可以在進程內存中創建一個字節數組。.NET加密處理密鑰的方式是安全的嗎?

接下來您將實例化一個SymmetricAlgorithm,如AesCryptoServiceProvider。然後,通常您將密鑰屬性設置爲您的內存中的密鑰。

然後,您創建一個ICryptoTransform,通常通過調用SymmetricAlgorithm.CreateEncryptor()CreateDecryptor()。您也可以跳過上面的Key屬性設置,直接將密鑰和IV傳遞給CreateEncryptor(byte[], byte[])CreateDecryptor(byte[], byte[])

  1. 是爲創建ICryptoTransform的防止流氓軟件讀取它,它更安全,一旦零字節數組?雖然字節數組正在使用中生成加密隨機數據並初始化轉換,但是pinning是否提供了任何安全性?

  2. 如果您設置SymmetricAlgorithm.Key屬性,是否有附加的副本在某處或只是一個指向您的祕密字節數組的指針?在創建轉換後立即處理SymmetricAlgorithm更安全嗎?

  3. 當ICryptoTransform創建時,我假設現在有一個額外的副本在RAM中。因此,在ICryptoTransform對象的生命週期中,流氓軟件可以讀取密鑰嗎?處置後如何?

    換句話說,如果我的軟件間歇性地寫入加密數據的流,用單獨的密鑰加密每一個小點並銷燬/處理我可以在其間的所有內容以最小化密鑰可能的時間被偷?

有人可能會說,一旦有一臺電腦上的流氓軟件,沒有什麼是安全的,因此它也沒用擔心。我寧願採取措施,儘量減少攻擊者獲得個人數據加密密鑰的潛在危害。

+0

什麼能防止任何流氓軟件在你沒有任何電源的PC上停止操作並讀取內存?即使你創建它,使用它並一個接一個地摧毀它? – gbianchi 2012-04-11 15:16:46

+0

http://blogs.msdn.com/b/ericlippert/archive/2011/09/27/keep-it-secret-keep-it-safe.aspx – SLaks 2012-04-11 15:16:58

+1

大多數.Net crypto類都將在'Dispose中安全地擦除它們的數據()'給你。 – SLaks 2012-04-11 15:17:23

回答

2
  1. 不,它並不安全。

  2. 沒關係,不,不安全。

  3. 是的,它可以被具有這些權限的任何軟件讀取。處理後可能無法讀取,因爲.Net加密中的Dispose()通常會將內存置零。

已經有關於這個許多宗教爭論,但是我只會讓答案儘可能明確從實際意義:如果「流氓軟件」,即惡意軟件,與權限運行訪問您的解密程序的內存空間,它不僅可以讀取密鑰,還可以讀取您解密的數據。當然,這更是一個問題 - 畢竟這是關鍵所在。你不會阻止用戶查看自己的數據,對嗎?那麼你不會增加任何安全性。換句話說,可計算性的十幾個網絡正在補充,而不是取代主機平臺上的安全規則。兩者加在一起,兩者都是安全所需要的。在解密機器上沒有主機安全性的情況下,您不能擁有加密安全性。嘗試添加它只是增加了更多的複雜性,並增加了引入真正的錯誤的可能性(儘管.NET爲你做了內存管理,所以這不是什麼問題)。

+0

我的問題是,是否會將未加密的密鑰儘可能短地保存在內存中,並且經常更改它們會使它難以竊取以阻止大多數潛在的盜賊?或者,對於偶然的黑客來說,水果是不是夠低的? – jnm2 2012-04-13 12:44:14

+0

最後的斷言是正確的。如果攻擊者具有閱讀和理解進程內存的技能,那麼當數據可用時,這是一個非常小的技能跳躍。 – offbyseveral 2012-05-16 12:02:13

相關問題