2017-01-08 59 views
7

.Net security noob here ...什麼是最簡單的方法來防止別人加載我的程序集?背景:雖然我真的在尋找「足夠好」的保護(有足夠的時間/金錢/聰明的人可以成功破解,破解和攻擊),但這似乎應該已經是一個解決的問題,而我只是想念它。最簡單的方法來防止有人加載我的託管程序集?

這是我(想)我知道:

  1. 雖然強命名可使用的安全層,它不是 必然意圖是,根據this microsoft documentation(見警告:

    在^注意我遇到了我無法加載第三方程序集(Aspose,我認爲它是)的情況,因爲他們做了 沒有簽署他們的組裝但是我的全部都是。所以我不得不ildasm他們的大會,用我們自己的snk簽署它,然後ilasm回)在 爲了使用他們的圖書館。 因此,強大的命名似乎並不像我對於良好的安全機制。但是 ...代碼中的簡單檢查 如何驗證調用程序集是否使用公鑰標記對我的 簽名?這有效嗎?

  2. 如果強命名不應該被用來做什麼我想 完成,正在執行的DLL更好的路由(似乎wintrust.dll可以幫助 本)的驗證碼數字簽名檢查 ?

    我一直在通過幾個供應商的工具混淆 和許多來與許可和各種東西。我可能會 使用模糊的點點隱藏一些敏感部位, 然而我還是想有防止 有人從加載我的敏感庫的機制,而不必使用 功能,如字符串和代碼加密 ,這往往伴隨着 表現(和其他)的成本。

所以回到剛纔的問題,什麼是阻止加載我的程序集的人最簡單的方式

+0

是否有投票關閉?如果是這樣,爲什麼?也許指出我已經回答了這個問題。可能我錯過了那裏已經有的東西。或者它也有可能,這並沒有真正得到有效回答。 – JohnZaj

+0

你是什麼意思,完全由「防止加載」?在一般情況下,這是不可能的,因爲你的程序集是一個不透明的文件。有可能的是阻止你的程序集內的.NET代碼運行,或者隱藏其中的東西。 PS:正如你發現的那樣,強大的命名只是關於識別。當你辭去一個組件時,它不會再來自同一個發佈者。如果該程序集包含檢查其發佈程序的代碼,則其中的代碼可以使用它來更改其操作過程,但組裝程序仍可以加載。 –

+0

你是否想阻止你.Net dll一直COM可讀? – TechLiam

回答

2

顯而易見,但可能不是那麼有用:最簡單的方法是刪除程序集。

+0

哈哈好的答案。然而,部分安全性仍然需要可用。當然,確保存在的東西的最好方法可能是把它放在海洋底部的鎖盒中,關閉。但是,如果它不可用,它不符合......的可用安全要求:) – JohnZaj

2

我想你想要的是防止人們逆向工程組裝,對嗎?諸如JustDecompiler之類的工具可以輕鬆獲得彙編代碼。 要混淆您的代碼,您可以隨時使用某些付費產品(Eazfuscator)或某些開源代碼(ObfuscarConfuserEx)。

+1

已經這樣做。但請注意,de4dotnet具有很好的跟蹤任何供應商的混淆工具的反混淆記錄。我一直在測試它。 – JohnZaj

4

事實上,你不能提供100%的保證,你的程序集不會被下載和使用的方式不好。但有些措施可以幫助您:

  1. 簽署您的安裝包(msi)。您需要獲得SSL 證書。用戶將在安裝過程中看到下載文件的發佈者。 如果你的安裝包被修改 - 簽名將被打破 和用戶安裝時會看到該應用程序是從未知 發行商或其他發佈商比你。
  2. 強裝配的命名,可以防止庫替換到另一個「壞」的庫。讓我們考慮下一個場景:您將庫A的應用程序部署到某個服務器,或者將您的應用程序安裝到他/她的計算機上的用戶。沒有強名稱的情況下,庫A或其他庫可以用一些代碼替換或修改爲另一個版本。例如,這個新版本可以在某處發送所有用戶密碼,或者執行其他惡意操作。如果一個庫在下載時更改了.Net,將會拋出強烈的名稱驗證異常。所以,你的應用程序將被打破。惡意代碼應重新編譯所有應用程序庫以使應用程序正常工作。這很難。
  3. 混淆也允許這樣做很難,甚至不可能瞭解這是怎麼回事內部組件(代碼重命名,字符串加密等)非常重要的事情。
  4. 如果你有一些非常關鍵的知識產權代碼,最好把它改寫成原生(C/C++)代碼。
  5. 如果您的應用程序是移動或桌面應用程序,它使後端請求您可以將重要的代碼到服務器端。
+0

關於你的第一點:我總是用我的MSI和bootstrappers等這樣做。你是否暗示在程序集/文件上簽名的數字簽名會是一種使它不可調用的途徑(無法加載)是不可能的)? – JohnZaj

+0

數字簽名僅允許識別文件發佈者。因此,如果您在安裝時從Microsoft網站下載msi或exe文件,請將Microsoft公司視爲已驗證的發佈者。而已。 –

+0

讓我這樣說吧:假設我放入了一種機制來禁止調用者使用我的程序集執行某些操作,除非調用程序集有一些安全的唯一標識符,是否最好將此唯一標識符作爲程序集上的數字簽名打電話?還是強名密鑰?我在後面想。 – JohnZaj

1

一個選項(其可以是或可以不是可行)是不給該組件給他們。如果您可以使您的應用程序基於Web(如Software as a Service),那麼(使用正確安全的服務器),您的客戶端將無法訪問程序集。

+1

正確,而且大多數情況下已經是這種情況,正好落後於正確安全的服務器。然而 - 雖然不太可能,但是大會並不是不可能接觸到非預期的人手中。例子一:心懷不滿的員工。 – JohnZaj

+0

@JohnZaj如果這是你的威脅模型的一部分,那麼你是正確的。 – TrueWill

相關問題