2012-05-28 61 views
1

假設我想發佈一個開源的類庫。我想知道是否應該發佈snk。例如,我確實需要一個snk來讓GAC友好。我已經看到了一個公共snk(NHibernate)和一個非公開的(DevExpress)大項目,以及來自雙方的小項目,所以沒有普遍的一致意見,這是肯定的。發佈.net強名私鑰的含義?

比方說,我不公佈私鑰。這個庫的用戶是開發人員,如果他們想要進行任何更改,需要重新編譯我的源代碼,或者爲強名稱驗證制定一個例外。無論是在頸部疼痛,我一直在那裏。

比方說,我發佈它。我看不出如何被利用。 CAS和東西不再廣泛使用,更重要的是,它甚至在.NET 4.5中被棄用。因此,窮人用戶根據其公鑰標記授予我的程序集一些權利並且壞人以相同的標記產生一個犯規程序集。如果一個壞人可以把他自己的dll放在別人的電腦上,那麼這真的不是阻止他們的強名。

我不認爲有人會檢查程序集的公鑰標記。當然,運行時檢查自引用程序集編譯以來它沒有改變,但僅此而已。出版商不公佈他們的標記,所以我知道,當我編譯我的時候,我可能會首先引用一個犯規程序集。

所以我傾向於發佈snk。在我看來,它在理論上提供的安全性很低,在實踐中沒有安全性,所以爲什麼讓用戶的生活更難。也許我應該做X.509代碼簽名(那個簽名是私有的私鑰),但是我認爲大多數人也不會去檢查。

要發佈還是不發佈?最好的論據贏了。理論方面,實踐方面,MS™準則,都歡迎。

回答

1

你不應該分發你強大的命名密鑰,但是如果有的話,這個密鑰與安全性無關。

強命名是一種識別技術,而不是安全措施。它僅用於防止意外的組裝標識衝突。 (對於「嚴重」的安全使用來說足夠強大,它將需要可更換的密鑰而不是自動生成的密鑰。)

但是,防止意外碰撞是一個充分的理由,開源項目。這是阻止您的1.2.3.4版本與其他人從修改源編譯的版本1.2.3.4相同的主要原因。考慮到打開項目源代碼的主要目標之一通常是允許人們分發由改變的代碼編譯的程序集,人們甚至可以爭辯說,對於開源項目來說,適當個性化的強命名是更多重要,而不是爲一個封閉的源代碼分發。

3

我不會發布它。

它將允許攻擊者重新編譯添加惡意代碼的程序集。更改後的程序集將與您的名稱相同。

如果您沒有發佈密鑰,則可以在不使用密鑰的情況下分發庫的「可信」二進制文件和源代碼。如果第三方開發人員需要定製庫,他們只需爲它生成一個新的密鑰(但生成的程序集將具有與正式版本不同的強名稱,從而允許運行時間區分這兩者)。

+0

我得到第一部分,但如果攻擊者編譯惡意程序集,下一步是什麼?如果他能讓某人運行這段代碼,他可以讓他們運行任何其他代碼,所以他首先不需要我的強名。如果攻擊者能夠使用特定的公鑰標記生成程序集,它如何更容易? – fejesjoco

+0

比方說,你有一個應用程序引用了你強大的命名程序集。如果用名稱相同但簽名不同的文件替換程序集,則運行時不會加載它,因爲應用程序要求提供特定版本的程序集。 如果沒有強名稱密鑰,則運行時將加載具有相同文件名的任何程序集。 – munissor

+0

看看這篇關於強名稱的文章:http://msdn.microsoft.com/en-us/magazine/cc163583.aspx – munissor