Dot-Net

.NET:執行檔應該是強名稱簽名的嗎?私有 DLL 呢?

  • February 15, 2010

我的應用程序由三個程序集組成:一個引用幾個 DLL 的單個 EXE。DLL 對我的應用程序是私有的 - 它們僅由該執行檔使用。

是否應該給這些程序集起一個強名稱?

FxCop 建議他們應該 - 對於它目前生成的所有程序集:

CA2210:使用強名稱密鑰簽署 <assembly>。

但是,這個建議說:

通常,您應該避免使用強命名應用程序 EXE 程序集。

您可能希望避免應用程序私有的強命名組件。

我應該給這些程序集一個強名稱嗎?在這種情況下這樣做(或不這樣做)有什麼好處?

編輯:

看看幾個結構相似的應用,似乎在這個問題上沒有達成共識。Paint.NETCrack.NET的二進製文件不是強命名的,而.NET ReflectorSnoop的二進製文件是強命名的。

有趣的是,對於 Expression 套件,Microsoft 採用了後一種方法:例如,在 Expression Blend 中,他們選擇對 Blend.exe 和隨附的 DLL(例如 Microsoft.Expression.Blend.dll)進行強名稱簽名。

對於我的第一個問題,我似乎不太可能得到一個簡單的答案:“我應該給這些程序集起一個強名稱嗎?”。但是,我的第二個問題仍然存在:

在這種情況下,強名稱簽名二進製文件有什麼好處嗎?或者,不這樣做有什麼好處嗎?

編輯2:

如果沒有壓倒性的理由採取任何一種方式,我傾向於給我的集會起一個響亮的名字。因此,我很想知道是否有人可以對此進行擴展(來自第一個連結):

“強命名會使管理依賴項變得更加困難,並為私有組件增加不必要的成本。”

在我看來,這些是在這種情況下強名稱簽名的好處:

  • 防止攻擊者將 DLL 替換為使用另一個密鑰簽名(或根本沒有簽名)的 DLL,而不替換 EXE(因為 EXE 包含包含公鑰的引用)。
  • 防止攻擊者在保留現有密鑰的同時修改程序集(因為這將導致簽名驗證失敗)。但是請注意,從 .NET 3.5 SP1 開始,預設情況下禁用這種情況下的簽名驗證。
  • 可以防止應用程序使用不匹配的程序集版本執行 - 如果由於部署錯誤而錯誤地替換了 DLL,則應用程序將無法載入它,而不是嘗試使用(可能不兼容的)錯誤版本。
  • 避免 FxCop 警告。

以及簽名的缺點(我相信這些是連結文章所指的):

  • 用兼容的較新版本替換 DLL(例如,為了修復錯誤)需要替換 EXE。
  • 在 .NET 版本 < 3.5 SP1 中,由於簽名驗證,強名稱程序集的載入時間更長。
  • 強命名的 DLL 也需要更長的時間來載入,因為載入器在本地查找之前會執行(在這種情況下是徒勞的)GAC 搜尋。

選擇是強命名(因此需要引用以匹配確切的鍵和確切的版本)或不是強命名(並且不需要兩者都匹配)似乎很可惜。如果可能需要密鑰而不是特定版本,那麼也許可以獲得簽名的前兩個好處,而不會同時獲得第一個缺點。也許這可以通過應用一個強名稱然後使用 app.config 處理版本控制問題來實現?

引用自:https://stackoverflow.com/questions/2268791