2011-12-06 45 views
13

我在許多文章中看到它被寫爲 組件的延遲簽名和強名稱可以防止它被淹死。.net中的延遲簽名和強名稱究竟是什麼?

這是什麼意思?

我知道的唯一情況是沒有強名稱,您無法在GAC中安裝程序集。 所以,假設我有一個沒有強名的組件,它可以是高舉?

有人請澄清我的疑問。

回答

31

在MSDN上有很多這方面的信息;例如:Strong NamingDelay Signing

總結基本思想:

強命名是一個簡單的識別標記蓋印組件的方式,以後可以用來驗證其還沒有被修改它被部署了。強名稱基本上是程序集名稱,版本和開發人員特有的「強名密鑰」的哈希。對強名稱組件的引用需要經過更嚴格的驗證,以引用非強名稱組件;特別是,強名稱引用必須與版本號匹配,並且強名稱散列必須匹配。

這有助於避免潛在的安全漏洞的兩種常見的來源在你的程序:

  1. 惡意用戶在你的程序有不同的組件使用相同的文件名替換的組件,但它包含惡意代碼,說服你的程序加載並執行它。
  2. 惡意用戶使用同一程序集的不同版本替換程序中的程序集,但已知問題已得到解決。

強名稱進程將拒絕這兩個操作,因爲強名稱數據不匹配。這就是爲什麼GAC中的程序集必須具有強大的名稱:它們的用途如此無處不在,否則它們將成爲此類劫持的主要目標。

但是,請注意,強名稱完全不能驗證發佈商的身份。任何人都可以發佈自稱爲微軟的強名稱程序集,強名稱中沒有任何內容可以駁斥該斷言。驗證身份是Authenticode數字簽名的工作,它與強名稱不同。兩者經常一起使用,但它們是正交的概念。

延遲簽名是一種在構建過程之外簽署程序集的技術。這裏的想法是,您的公司可能制定的策略不允許在構建時使用強名稱密鑰(可能它們保持脫機狀態,或者保護密碼)。延遲簽署的程序集標有空白的強名稱密鑰,名稱密鑰:它基本上爲授權用戶預留稍後添加密鑰的空間。與此同時,包含了部分強名鍵 - 僅爲其他程序集提供足夠的信息以提供強有力的參考,但還不足以檢測更改或修改。