2009-07-31 115 views
8

好了,我一定是愚蠢的,因爲我已經閱讀過這一點: http://www.csharp411.com/net-assembly-faq-part-3-strong-names-and-signing/我似乎無法理解這個.NET程序集簽名的事情

我仍然不明白這一點...

假設我打開項目的屬性並轉到「簽名」選項卡,然後選中「簽署程序集」並使用密碼生成新程序集。一個帶有.pfx擴展名的強名字密鑰文件,包含公鑰和私鑰,都已創建,VS會在編譯時對我的程序集進行數字簽名,對不對?

私鑰怎麼樣?不應該是私人的,我是開發者,是唯一擁有它的人嗎?不應該只使用公鑰對程序集進行簽名嗎?

任何人都可以解釋這一點嗎?基本上,我想簽署我的項目的程序集,並允許用戶檢查程序集是否真的由我開發,我只能保留私鑰(我認爲我應該這樣做)。

回答

8

你基本上是對的。

您創建一個密鑰對並將其用於簽名。但不要發送pfx(或snk)文件,它包含公鑰和私鑰,並應保持安全。

公鑰作爲簽名過程的一部分添加到程序集中。

將程序集加載到應用程序中時檢查此簽名。最終用戶還可以在GAC中檢查公鑰標記,但這不是一個真正便捷的過程。你必須以某種方式告訴他們你的公鑰標記。

而且整個事情只有像保持密鑰文件私密的能力一樣可靠。

另請注意,理想情況下,您應該每個公司只有1個關鍵。如果您擔心與(許多)同事分享,請調查延遲簽名。

2

程序集簽名基於public-key cryptogrpahy(PKI)。簡而言之,一般概念是,當你使用PKI對密碼簽名時,私鑰用於簽名,但公鑰用於驗證簽名。私鑰不能用於驗證簽名,只能創建它。公鑰不能用於創建簽名,只能驗證它。

鑑於此,保持私鑰安全和私密至關重要。如果您希望保持最高級別的安全性併爲您的客戶提供最高級別的真實性,最好使用延遲簽名,並讓單個個人或部門負責管理您的完整公鑰/私鑰對。開發人員不應該有權訪問私鑰,並可能使用延遲簽名選項來繼續開發強名稱的程序集,而不會影響安全性和真實性。

+0

實際上,公鑰/私鑰的使用是非常對稱的。正常編碼(不簽名)使用公鑰。 – 2009-07-31 20:43:03

4

數字簽名涉及計算二進制文件的散列值,然後使用您生成的密鑰對中的私鑰對生成的散列值進行加密。除此之外,VS還會將公鑰添加到程序集中。現在,當在客戶端執行此操作時,運行時將使用程序集中的公鑰解密簽名(哈希),然後將其與客戶端二進制文件的計算哈希匹配。如果它們匹配,則意味着二進制文件沒有被篡改。

1

簽名=加密使用私鑰
驗證大會的SHA1哈希=比較大會所計算的散列的公鑰解密簽名

因此,任何以公鑰可以驗證的組件,但只有使用PrivateKey的作者可以簽署一個程序集。

PublicKey token =以小端字節順序排列的PublicKey的SHA1散列的最後64位。

相關問題