2010-08-05 495 views
2

如果您有.Net應用程序(或任何其他應用程序),您如何安全地存儲內部加密密鑰?我不是在談論用戶輸入的密鑰,而是在程序本身中硬編碼的密鑰,用於在程序的其他實例之間進行交談。例如,如果您有對等類型程序,則可能需要加密數據包,以確保您正在與另一個程序實例通信,而不是其他人的程序。我的解決方案是將密鑰硬編碼到客戶端,並簡單地加密/解密所有內容。如何安全地在.Net中存儲加密密鑰?

但是,我想知道,如果這在.NET中是安全的。我沒有廣泛使用Reflector或類似的東西,但從我所聽到的,解開CIL的.Net應用程序聽起來相當容易。對於有這些應用程序之一的人來說,是否會發現我的魔法數字是微不足道的?

+1

您需要查看混淆軟件。 – 2010-08-05 21:10:05

回答

3

絕對沒有辦法驗證連接另一端的可執行文件是否是您寫的。如果您使用密鑰加密密鑰,那麼您在哪裏存儲第二個密鑰?如果你的Diffie-Hellman用服務器獲得密鑰,你在哪裏存儲密鑰? (提示:在內存中,它可以從那裏讀取)。這是一個你永遠無法解決的遞歸問題。

我讀過AOL即時通訊服務器會定期輪詢AIM客戶端的特定代碼地址(即計算SHA1(address1 - > address2))的哈希,然後斷開客戶端,如果哈希不正確。這是因爲重新分配可執行文件是非法的(並且在每兩個時間間隔之間建立一個散列表是不可行的),所以這僅僅是一個法律挑戰,而不是技術問題。

如果你想真正力圖打敗逆向工程(實際上做得很好)軟件,嘗試附加一個調試器的Skype :-)

+0

一年後的追蹤:http://www.theregister.co.uk/2011/06/03/open_sourcing_skype/ - 因此放棄了保護分發給客戶的任何東西的所有希望:-PI對Skype的效力感到非常印象直到今年6月份才進行反向逆向工程。 – Hut8 2011-06-27 06:48:11

1

而不是硬編碼密鑰,您可以生成一個非對稱密鑰(每個會話?)。您可以使用此密鑰將公鑰發送給對等方,對等方可以加密只有您可以解密的消息。

非對稱加密速度慢,您的對等方也可能發送使用您的公鑰編碼的對稱密鑰,僅用於此會話。

如果您確實需要存儲機密數據,則可以使用ProtectedData類。你可以在安裝過程中調用它來存儲你的祕密(密鑰)。

+0

但是'byte [] secret = {0,1,2,3,4,1,2,3,4};'只需打開Reflector中的.exe就可以看到? – dlras2 2010-08-05 21:01:12

+0

是的,如果這在你的代碼中,它將是可讀的。 – GvS 2010-08-05 21:07:07

+1

如果你把它放在另一個DLL中,並將該DLL嵌入到你的程序集中,它不會在反射器中打開......但它仍然可以被提取並打開。通過分層保護並將反編譯提升到一個大多數人不會感到困擾的級別,就是使用純粹的託管代碼所能做的一切。 – 2010-08-09 10:28:16

1

如果密鑰存儲在程序的可執行代碼或資源中(或者在Windows TCB中使用可執行代碼中的密鑰),則可以通過足夠的努力將其解碼。

由於最終的可執行文件中包含了所有需要的信息,因此無論您添加什麼保護措施(因爲解碼代碼也在其中)。

首先:

  • 不要創建自己的機制,有太多的簡單的方法來危及安全(專家往往需要多次嘗試得到它的權利)。
  • 想想你想要保護什麼的價值,以及那些可能攻擊它的人可用的資源。如果沒有什麼價值來保護你,就不需要太多的保護。
  • 除非你保護某個地方如Aldermaston你不需要安全

KISS原則將爲您服務。

2

您也可以嘗試在你的自定義的加密/解密算法將轉換爲C++庫,然後使用interop來回編組數據。