2011-03-11 86 views
10

我知道許多在.NET框架中可用的加密提供程序以及如何使用它們的基礎知識。這很簡單。保護C#中的加密密鑰#

但我擔心的是這個。

假設我想使用這些庫來加密XML序列化對象以防止篡改以及任何人前來查看這些文件的內容的能力。

我總是留下的問題是,解密這些數據的密鑰需要作爲常量存儲在我的應用程序的某處。基本上使整個練習毫無意義。

那麼,如何在反彙編應用程序內安全地存儲加密算法的密鑰?

編輯:所以,如果我正確理解下面的兩個答案。這意味着基本上任何實現(要安全)都要求它是隻讀或只寫,但從來都不是?它是否正確?

+0

儘可能地模糊XML(添加隨機數據+使用ROT13原始加密方案+等)並將其序列化爲二進制模式或Base64模式。要點是通過程序反彙編對XML進行解碼,儘可能讓用戶不用花時間去做這件事...... – 2011-03-18 14:01:14

回答

4

你沒有。如果應用程序可以訪問密鑰,那只是安全而已。最好以某種方式驗證用戶(密碼是最簡單的例子),以確保他被允許訪問數據。你不能讓應用程序爲你做,因爲它不可靠。任何人都可以獲得存儲在應用程序中的信息。

如果關鍵信息存儲在其他地方,惡意用戶或應用程序也可能訪問它。如果沒有,那麼直接將數據存儲到這個神奇的安全地點。

現在,如果您仍然希望走這條路,並存儲敏感數據,而無需身份驗證,最好的辦法 - 或者至少是一個簡單的方法是半路安全的 - 可能是DPAPI(見System.Security.CryptographyProtectedData類)。它將使用機器密鑰或用戶帳戶密鑰加密數據(您可以選擇該密鑰)。因此,在另一臺計算機上運行的程序或另一個用戶帳戶無法訪問它。 Windows將嘗試保護這些密鑰,但實際上任何在適當的機器上運行的應用程序或具有適當的用戶帳戶的應用程序都可能能夠訪問您的數據。

+1

可能使用用戶的密碼進行加密和解密是個不錯的主意。但當然這會暴露密碼。可能是密碼的散列可以完成這項工作,或者其他一些密碼派生的值。 – 2011-03-11 03:02:01

+0

如果您使用自定義形式的身份驗證和加密,則可能是對的。如果您使用的是DPAPI,它會自動處理所有這些東西。據我記得,在用戶更改密碼後,數據仍然可以被解密。 – ollb 2011-03-11 03:11:38

+0

這也造成了它自己的問題。如果用戶想更改密碼怎麼辦? – 2011-03-12 14:16:58

0

有各種可能的解決方案。其中之一是使用RSA。或者,您可以使用TLS中使用的相同方法。

一個好方法是生成一對公鑰和私鑰。與私人加密並銷燬密鑰。使用公鑰,您可以解密但不會篡改數據。

+0

如果你銷燬私鑰,這是一個只讀解決方案。但即使如此,惡意用戶也可以用自己的密鑰對創建新文件,並替換應用程序用於解密的密鑰。這當然取決於他修改公鑰存儲位置的能力。 – ollb 2011-03-11 02:33:51

1

我們假設你正在使用某種公鑰加密方案,否則它將毫無意義。

答案是你不要將私鑰存儲在應用程序的任何位置。您將它存儲在只有您的應用程序可以訪問的地方。例如,只有管理員和您的應用有權讀取本地系統中的文件。在受保護的網絡共享上。等

想想我們如何管理密鑰爲人。我們可以將我們的私人文件保存在一個文件中,或者加密的USB驅動器或類似的東西。相同的原則適用於應用程序。

+0

這不就是解決問題嗎?如果您確實擁有隻有您的應用程序可以訪問的受信任位置,則您可以將數據存儲在那裏並完成它。 – ollb 2011-03-11 02:42:55

+0

沒有「只有管理員和您的應用可以訪問」的位置。如果你的應用可以訪問它,你的應用的用戶也可以。 – 2011-03-11 06:10:44