假設我想發佈一個開源的類庫。我想知道是否應該發佈snk。例如,我確實需要一個snk來讓GAC友好。我已經看到了一個公共snk(NHibernate)和一個非公開的(DevExpress)大項目,以及來自雙方的小項目,所以沒有普遍的一致意見,這是肯定的。發佈.net強名私鑰的含義?
比方說,我不公佈私鑰。這個庫的用戶是開發人員,如果他們想要進行任何更改,需要重新編譯我的源代碼,或者爲強名稱驗證制定一個例外。無論是在頸部疼痛,我一直在那裏。
比方說,我發佈它。我看不出如何被利用。 CAS和東西不再廣泛使用,更重要的是,它甚至在.NET 4.5中被棄用。因此,窮人用戶根據其公鑰標記授予我的程序集一些權利並且壞人以相同的標記產生一個犯規程序集。如果一個壞人可以把他自己的dll放在別人的電腦上,那麼這真的不是阻止他們的強名。
我不認爲有人會檢查程序集的公鑰標記。當然,運行時檢查自引用程序集編譯以來它沒有改變,但僅此而已。出版商不公佈他們的標記,所以我知道,當我編譯我的時候,我可能會首先引用一個犯規程序集。
所以我傾向於發佈snk。在我看來,它在理論上提供的安全性很低,在實踐中沒有安全性,所以爲什麼讓用戶的生活更難。也許我應該做X.509代碼簽名(那個簽名是私有的私鑰),但是我認爲大多數人也不會去檢查。
要發佈還是不發佈?最好的論據贏了。理論方面,實踐方面,MS™準則,都歡迎。
我得到第一部分,但如果攻擊者編譯惡意程序集,下一步是什麼?如果他能讓某人運行這段代碼,他可以讓他們運行任何其他代碼,所以他首先不需要我的強名。如果攻擊者能夠使用特定的公鑰標記生成程序集,它如何更容易? – fejesjoco
比方說,你有一個應用程序引用了你強大的命名程序集。如果用名稱相同但簽名不同的文件替換程序集,則運行時不會加載它,因爲應用程序要求提供特定版本的程序集。 如果沒有強名稱密鑰,則運行時將加載具有相同文件名的任何程序集。 – munissor
看看這篇關於強名稱的文章:http://msdn.microsoft.com/en-us/magazine/cc163583.aspx – munissor