2010-10-20 74 views
120

在我接管的一些C#代碼中(在Visual   Studio   2005中),我注意到這些程序集都使用相同的.snk文件進行了簽名。C#:爲什麼要簽署一個程序集?

  • 爲什麼以前的作者用這種方式簽署了程序集?
  • 是否需要簽署程序集,以及 在簽名時會出錯?
  • 簽名程序集有什麼缺點 - 它會導致延遲嗎?

回答

138

爲什麼以前的作者用這種方式簽署了程序集?

不知道,也許他想讓他所有的程序集都用相同的密鑰簽名。

是否需要簽署程序集以及未簽署程序時會出現什麼問題?

不,這不是必要的,但它是一種機制,可以確保裝配的真實性。它可以讓你確保程序集沒有被篡改,而且它確實源自於這位作者。如果您想將它們放入GAC,也是必要的。

簽署程序集有什麼不利之處 - 它會導致延遲嗎?

簽名的程序集只能加載其他簽名的程序集。此外,它們與特定版本綁定,這意味着如果您想使用不同的版本,則需要使用綁定重定向或重新編譯應用程序。由於對簽名進行了驗證,所以性能開銷也有一些小問題,但它很少,您不應該擔心。

+3

明智的答案 – Eon 2014-04-15 11:48:49

+0

請注意,放置在GAC中時,驗證簽名不會再發生(自.NET 2.0開始); [只有在將其添加到GAC時纔會發生一次](http://davidyardy.com/archive/strong-names-and-signing-assemblies-netaspx/)。 – Abel 2016-10-12 18:25:10

+0

你覺得現在簽署它怎麼樣?在基於Web的系統上?如果我是正確的,那麼只有在談論已安裝的軟件時纔是必要的,對嗎?如果我使用TFS將我的應用程序發佈到Azure,我知道它沒有被篡改,對吧?或者我錯過了一些安全部分? – 2017-05-08 14:12:04

31

如果您想將它們放在GAC中,則需要簽署程序集。

如果您簽署了可執行文件,那麼它鏈接到的任何類庫也需要進行簽名。如果您使用第三方庫(如果您需要使用ActiveX控件或類似工具),這可能會很困難。

理查德·格里姆斯已經.NET寫安全良好的車間,幷包括了在這一章:Security Workshop

原因所有組件用相同的.snk文件簽署的可能是,如果他使用的單位測試代碼覆蓋率。爲了能夠執行代碼覆蓋(至少使用視覺  Studio   2005的測試版內置的工具),並且如果程序集已簽名,則需要指定用於簽名的.snk文件,但我認爲您只能爲整個解決方案指定一個.snk文件,因此如果您使用不同的.snk文件簽署各種類庫,則一次只能檢查其中一個的代碼覆蓋率。

+0

移到http://www.grimes.nildram.co.uk/workshops.htm – LiamV 2013-08-28 08:15:54

+0

@LiamV謝謝,更新。 – 2013-08-28 11:52:04

15

簽署裝配體的一個非常重要的原因是您可以確定它是您的裝配體。由於私鑰是你的,所以沒有其他人可以使用同一個密鑰簽署程序集。這意味着當一個程序集的公鑰是一個你知道的(你可以使用GetType().Assembly.GetName().GetPublicKey()函數檢索這個程序集),程序集是你的,並且它沒有被篡改。

1

簽署DLL的所有用途的Inspite,該dll應該只有兩個原因

1版本

2.認證

一個簽名。版本控制表示dll的版本是什麼版本,同時將它們推入到GAC中,同名的兩個dll可以存在,但版本不同

b。身份驗證表示該dll是否未被篡改,並且在創建時確實存在。

如果您想了解更多有關的基礎知識和DLL簽名您可以參考here

+1

你現在對簽名有什麼看法?在基於Web的系統上?如果我是正確的,那麼只有在談論已安裝的軟件時纔是必要的,對嗎?如果我使用TFS將我的應用程序發佈到Azure,我知道它沒有被篡改,對吧?或者我錯過了一些安全部分? – 2017-05-08 14:11:50

+1

我沒有看到爲什麼我們現在應該簽署一個dll,這將在Azure中部署爲Paas解決方案。但是,如果你有iaas解決方案,你可以在同一個iis中通過web應用程序重用dll。我不推薦。我們應該通過API調用它們,而不是使用來自GAC(微服務架構)的這些dll。 – 2017-05-09 04:54:47

相關問題