我一直在尋找一種方法來存儲給定的AES密鑰,以便它不能被檢索,但它仍然可以用於加密和解密(使用C#)。我認爲非對稱密鑰存儲的等價物可以找到here,但我正在尋找可用於對稱加密的東西。它是否以託管形式存在(pre。net 4)?如何使用.Net(C#)在Windows中安全地存儲AES密鑰?
回答
根據你所反對的人,你可以使用ProtectedData
class。
我們可能必須走這條路,但我的理解是,如果我們使用ProtectedData存儲我們的密鑰,那麼我們可以稍後再取回它。我們不想讓它恢復原狀,只能使用它。 – Nogwater 2010-09-29 21:35:56
您只能以相同的用戶身份登錄後才能重新登錄。 – SLaks 2010-09-29 21:59:05
是的,我認爲這可能對我們有用。這並不是很理想,因爲我們將軟件安裝在一組機器上,這意味着我們需要存儲的AES密鑰的加密塊在每臺機器上會有所不同。現在我們傾向於這樣:http://www.codestrider.com/BlogRead.aspx?b=d147ff4f-65e0-47f5-a39b-40ae07a42005使用公鑰/私鑰加密和Window的證書存儲來保護真正的關鍵。 – Nogwater 2010-09-29 22:11:51
@SLaks是正確的,如果它在你的記憶中它可以被訪問。你可以讓它變得更加困難,但總有可能。
這就是爲什麼那些嚴肅卸載密碼的人。
一個選項是smart card。這使您可以將數據移動到卡上並返回結果,但不允許訪問密鑰材料。它不在您的PC內存空間中,因此無法泄漏。
羅斯安德森有一篇很好的論文,Programming Satan's Computer關於這種事情。摘要:
問題是存在一個敵意的對手, 誰可以隨意改變信息。實際上,我們的 任務是編寫一個計算機,該計算機給出的答案是 ,它們在最不方便的時刻可能會出現錯誤和惡意 錯誤。
即使你不關心物理內存,只是硬盤和源,你仍然需要警惕虛擬內存。如果您不小心(或使用精心編寫的服務),您可以在交換文件中獲得純文本密鑰。這是另一個討論這個問題的鏈接。不是你想這樣做,但它使問題變得明顯:Encrypting Virtual Memory。我相信有系統調用爲此目的將內存標記爲不可擦除,但我找不到鏈接。
即使對於非對稱數據,如果密鑰存儲在計算機中並稍後使用,則在使用之前將其檢索並解密。在這一點上,一個熟練的黑客可以檢索它(通過捕獲計算機內存並研究它)。這不是微不足道的,但仍然有可能。
通常爲了解決您的問題提供了USB cryptotokens和cryptocards。這些硬件設備有自己的存儲器用於存儲對稱密鑰和非對稱密鑰,並且它們具有使用該密鑰執行加密操作的處理器。密鑰永遠不會離開設備,並且實際上不可能從設備中強制提取它(存在一些硬件攻擊,例如使用顯微鏡掃描內存,但它們比計算機上的軟件攻擊更復雜)。
因此,如果您的密鑰真的很有價值,請使用USB cryptotoken。該設備的價格非常適中 - 每個單元大約70美元至100美元,並且有幾家供應商提供這種設備。
Windows DPAPI(Win32 documentation)及其.NET包裝器(ProtectedData Class)不存儲任何數據。相反,Windows DPAPI會返回一個加密密碼值,您可以將其存儲在任何地方,包括多臺服務器上。
在我的工作地點,我們使用DPAPI爲AES密鑰生成密碼,然後我們將其存儲在註冊表中。
Windows DPAPI的唯一目的是對數據進行加密,以便只有給定的用戶帳戶或機器才能解密它,而無需存儲密碼。
.NET ProtectedData類自2.0以來一直在.NET Framework中。
我會堅持與第三方產品的Windows DPAPI,因爲它成熟,穩定,免費,易於使用,並在.NET中完全支持。
只是爲了確定我的理解......要在多臺機器上使用ProtectedData,需要在這兩臺機器上都有一個共享用戶帳戶,這需要由域控制器提供,對嗎? – Nogwater 2010-10-04 15:32:25
您可以使用DPAPI在兩臺獨立的計算機上獨立加密密鑰,如果需要,可以在兩個不同的用戶帳戶下運行,只需要兩個密碼值不可互換即可。必須在進行加密的相同帳戶(或使用基於機器的DPAPI的機器)下解密。如果你想擁有一個可以在多臺機器上解密的密碼,那麼是的,我會說你需要一個共享帳戶和一個域控制器。 – saille 2010-10-04 20:24:04
感謝您的澄清。 – Nogwater 2010-10-04 22:02:48
- 1. 如何在C++中安全地存儲AES加密密鑰?
- 2. 如何安全地在.Net中存儲加密密鑰?
- 3. 如何在iPhone上安全地存儲AES密鑰
- 4. 安全地在Android設備中存儲AES密鑰
- 5. 如何安全地存儲密鑰?
- 6. 如何在android中安全地存儲加密密鑰?
- 7. 如何在java中安全地存儲加密密鑰?
- 8. 存儲AES密鑰
- 9. 如何安全地存儲應用程序ID /密鑰?
- 10. 沿着加密的AES密鑰存儲密碼哈希的安全隱患
- 11. AES加密和密鑰存儲?
- 12. 密鑰容器,足夠安全地存儲私鑰?
- 13. 在iPad/iPhone上的用戶會話期間安全地存儲安全密鑰?
- 14. 如何在.NET中安全地使用二進制文件分發密鑰?
- 15. 安全的地方存儲API祕密密鑰
- 16. 在PHP中使用AES加密時,應該在哪裏存儲密碼密鑰?
- 17. Android的安全存儲密鑰
- 18. 如何在AES數據庫中存儲AES加密密碼
- 19. 如何使用存儲在密鑰庫中的自定義密鑰執行AES加密?
- 20. 在DefaultConfiguration中存儲加密密鑰是否安全?
- 21. Byte []密鑰加密C#Aes
- 22. 安全地在文件頭中存儲AES密碼參數(blocksize/blockmode/keysize等)?
- 23. 如何使用greasemonkey安全地存儲密碼?
- 24. 在iPhone應用程序中存儲API密鑰不安全?
- 25. 如何在.NET中存儲加密密鑰
- 26. 將公鑰/私鑰安全地存儲在數據庫中
- 27. 安全地檢索密鑰
- 28. 如何安全使用API密鑰
- 29. 如何在反應原生客戶端安全地存儲密鑰?
- 30. 如何安全地將密碼存儲在文件中?
如果您可以使用它進行加密,您可以檢索它。 – SLaks 2010-09-29 21:32:53
@ SLaks:除非操作系統是在做什麼加密,並將密鑰存儲在某個「安全」的地方。比如說,「保護存儲」服務可能會這樣做。 – cHao 2010-09-29 21:37:24
@cHow。這就是我的想法。微軟提供了這種類型的功能與證書(他們可以存儲和使用您的私鑰安全),但可能不是我所期待的。 – Nogwater 2010-09-29 22:00:19