2010-09-29 212 views
9

我一直在尋找一種方法來存儲給定的AES密鑰,以便它不能被檢索,但它仍然可以用於加密和解密(使用C#)。我認爲非對稱密鑰存儲的等價物可以找到here,但我正在尋找可用於對稱加密的東西。它是否以託管形式存在(pre。net 4)?如何使用.Net(C#)在Windows中安全地存儲AES密鑰?

+0

如果您可以使用它進行加密,您可以檢索它。 – SLaks 2010-09-29 21:32:53

+1

@ SLaks:除非操作系統是在做什麼加密,並將密鑰存儲在某個「安全」的地方。比如說,「保護存儲」服務可能會這樣做。 – cHao 2010-09-29 21:37:24

+0

@cHow。這就是我的想法。微軟提供了這種類型的功能與證書(他們可以存儲和使用您的私鑰安全),但可能不是我所期待的。 – Nogwater 2010-09-29 22:00:19

回答

2

根據你所反對的人,你可以使用ProtectedData class

+0

我們可能必須走這條路,但我的理解是,如果我們使用ProtectedData存儲我們的密鑰,那麼我們可以稍後再取回它。我們不想讓它恢復原狀,只能使用它。 – Nogwater 2010-09-29 21:35:56

+0

您只能以相同的用戶身份登錄後才能重新登錄。 – SLaks 2010-09-29 21:59:05

+0

是的,我認爲這可能對我們有用。這並不是很理想,因爲我們將軟件安裝在一組機器上,這意味着我們需要存儲的AES密鑰的加密塊在每臺機器上會有所不同。現在我們傾向於這樣:http://www.codestrider.com/BlogRead.aspx?b=d147ff4f-65e0-47f5-a39b-40ae07a42005使用公鑰/私鑰加密和Window的證書存儲來保護真正的關鍵。 – Nogwater 2010-09-29 22:11:51

1

@SLaks是正確的,如果它在你的記憶中它可以被訪問。你可以讓它變得更加困難,但總有可能。

這就是爲什麼那些嚴肅卸載密碼的人。

一個選項是smart card。這使您可以將數據移動到卡上並返回結果,但不允許訪問密鑰材料。它不在您的PC內存空間中,因此無法泄漏。

羅斯安德森有一篇很好的論文,Programming Satan's Computer關於這種事情。摘要:

問題是存在一個敵意的對手, 誰可以隨意改變信息。實際上,我們的 任務是編寫一個計算機,該計算機給出的答案是 ,它們在最不方便的時刻可能會出現錯誤和惡意 錯誤。

即使你不關心物理內存,只是硬盤和源,你仍然需要警惕虛擬內存。如果您不小心(或使用精心編寫的服務),您可以在交換文件中獲得純文本密鑰。這是另一個討論這個問題的鏈接。不是你想這樣做,但它使問題變得明顯:Encrypting Virtual Memory。我相信有系統調用爲此目的將內存標記爲不可擦除,但我找不到鏈接。

+0

我們並不十分偏執,擔心可以訪問內存的人,僅僅是爲了服務器的硬盤驅動器(包括讀取我們的源代碼)。 – Nogwater 2010-09-29 21:57:25

+0

增加了一點硬盤和虛擬內存 – 2010-09-30 16:07:20

+0

謝謝保羅。這很好。 – Nogwater 2010-09-30 16:31:32

0

即使對於非對稱數據,如果密鑰存儲在計算機中並稍後使用,則在使用之前將其檢索並解密。在這一點上,一個熟練的黑客可以檢索它(通過捕獲計算機內存並研究它)。這不是微不足道的,但仍然有可能。

通常爲了解決您的問題提供了USB cryptotokens和cryptocards。這些硬件設備有自己的存儲器用於存儲對稱密鑰和非對稱密鑰,並且它們具有使用該密鑰執行加密操作的處理器。密鑰永遠不會離開設備,並且實際上不可能從設備中強制提取它(存在一些硬件攻擊,例如使用顯微鏡掃描內存,但它們比計算機上的軟件攻擊更復雜)。

因此,如果您的密鑰真的很有價值,請使用USB cryptotoken。該設備的價格非常適中 - 每個單元大約70美元至100美元,並且有幾家供應商提供這種設備。

0

要繼續卸載crypto的趨勢,如果您知道所有集羣的硬件,如果主板上有密鑰,您可以在TPM中輸入密鑰,這只是usb或smart-卡解決方案。

+0

我無法訪問這些服務器的USB或智能卡。我們的一些盒子仍然運行Windows 2003,所以對我來說這不是一個真正的選擇。是否有用於TPM的標準.NET 3.5庫?也許它會對別人有用。 – Nogwater 2010-09-30 16:30:44

5

Windows DPAPI(Win32 documentation)及其.NET包裝器(ProtectedData Class)不存儲任何數據。相反,Windows DPAPI會返回一個加密密碼值,您可以將其存儲在任何地方,包括多臺服務器上。

在我的工作地點,我們使用DPAPI爲AES密鑰生成密碼,然後我們將其存儲在註冊表中。

Windows DPAPI的唯一目的是對數據進行加密,以便只有給定的用戶帳戶或機器才能解密它,而無需存儲密碼。

.NET ProtectedData類自2.0以來一直在.NET Framework中。

我會堅持與第三方產品的Windows DPAPI,因爲它成熟,穩定,免費,易於使用,並在.NET中完全支持。

+0

只是爲了確定我的理解......要在多臺機器上使用ProtectedData,需要在這兩臺機器上都有一個共享用戶帳戶,這需要由域控制器提供,對嗎? – Nogwater 2010-10-04 15:32:25

+4

您可以使用DPAPI在兩臺獨立的計算機上獨立加密密鑰,如果需要,可以在兩個不同的用戶帳戶下運行,只需要兩個密碼值不可互換即可。必須在進行加密的相同帳戶(或使用基於機器的DPAPI的機器)下解密。如果你想擁有一個可以在多臺機器上解密的密碼,那麼是的,我會說你需要一個共享帳戶和一個域控制器。 – saille 2010-10-04 20:24:04

+0

感謝您的澄清。 – Nogwater 2010-10-04 22:02:48

相關問題