2012-02-16 97 views
3

我在最終用戶機器上將知識產權編碼爲.net 2.0完全受信任的程序集(.exe + dll),我希望避免被黑客攻擊/反向工程(WebService /雲計算解決方案不是一種選擇)。以下是我爲了實現此目標而收集的技術列表。.Net程序集安全 - 防止黑客攻擊/反向工程

我的問題是:

  1. 是我的假設是正確的,還是我做錯事的一個或多個的技術?
  2. 此列表是否足以防止惡意攻擊,或者我應該添加其他保護措施嗎?

在此先感謝。

-

建議的方法

  1. 註冊使用相同的強名稱密鑰的所有組件。
    這有兩個好處:
    • A.確保任何修改組件將使其無效,
    • B.所有組件將具有相同的公鑰,通過它們可以相互識別。
  2. 對程序集進行數字簽名:兩者都讓用戶知道執行的代碼來自正確的源代碼,並且 - 添加另一個標識組件,通過該組件可以識別對方。
  3. 通過抓取調用堆棧並驗證所有調用者在「社區」中來強制執行上述操作。
    可能的潛在客戶:
  4. 使用AOP(例如Spring.NET)將調用堆棧搜尋代碼注入某些/所有方法。
    • 這主要是因爲在.NET程序集中沒有單個入口點(如Win32 DLL的DllMain())。
  5. 混淆所有程序集以阻止反向工程和反射執行嘗試(強制名稱簽名將在混淆後執行)。
  6. 集成System.ComponentModel.LicenseProvider機制。
  7. 利用「InternalsVisibleTo」程序集級別屬性爲了在預定義的程序集集中公開內部信息。
  8. 可能使用NGEN將解決方案轉換爲本地代碼。

要考慮的問題

  • 實現上述將最有可能引入性能損失,所以對時間要求嚴格的處理,例如,應小心處理的部分或全部。
  • 對於這種完全信任的程序集,CAS似乎並不重要。
+5

這不是博客。請遵循發佈指南(摘自常見問題解答):「您應該只根據您面臨的實際問題提出實際的,可回答的問題。聊天,開放式問題會降低我們網站的實用性,並將其他問題推到首頁。 「 – Joe 2012-02-16 19:19:58

+0

「這不是單一/最佳答案類型的文章。」然後,StackOverflow *不是這種幫助的最佳位置。 – Joe 2012-02-16 23:54:53

+0

需要採取的措施,我將重新說明這個問題。 – AVIDeveloper 2012-02-17 00:25:53

回答

2

恐怕你不會得到你想要的所有安全。你看,這是使用中間語言的這些語言/平臺的問題。它必須採用所有運行時實現可以使用的格式,然後生成本機代碼。

我見過一些關於篡改簽署程序集的博客文章。我還沒有嘗試,但我認爲它的作品。除此之外,混淆工具只會讓它變得更難,但並非不可能提取代碼(儘管有一些相當不錯的工具會使其變得非常困難)。 NGEN不是那樣的。您仍然有分發原始程序集。

我認爲保護代碼的最有效和最安全的方法就是將其轉移到無法反編譯的技術上,例如,將敏感代碼移至非託管C++並在您的C#代碼中使用DLLImport。

這並不意味着你不應該試圖保護你的代碼,但你應該記住,你不會100%的保護。如果您無法用其他語言重寫敏感代碼,請使用混淆和簽名。你不能比這更安全。

+0

+1用於在非託管C++中編寫敏感代碼。您對代碼執行的預防有什麼經驗/想法? – AVIDeveloper 2012-02-17 19:28:35

+0

將您的類型標記爲內部並使用InternalsVisibleTo可以幫助您。如果我沒有錯,它會阻止通過反射來實例化。如果沒有,你可以這樣做(警告臭的代碼!):class MyClass {public MyClass(){if(typeof(MyClass).Assembly.GetName()。GetPublicKeyToken()!= Assembly.GetEntryAssembly()。GetName ).GetPublicKeyToken()){拋出新的異常(「抱歉,夥計」);}}}但是,再次,你不會100%安全。儘管大多數人都會放棄,但它可能會讓人很難欺騙。而一個很好的混淆器會讓API很難理解。 – Fernando 2012-02-17 21:01:07

+0

這就是我正在考慮的方向。爲什麼它是臭編碼,什麼使它不是100%安全? – AVIDeveloper 2012-02-17 21:17:57