一個單位能夠具備開發人員在平常使用中沒法訪問的嚴密保護的密鑰對。 公鑰一般是可用的,但對私鑰的訪問權僅限於少數我的。 開發強名稱程序集時,每一個引用具備強名稱的目標程序集的程序集中都包含了用於爲目標程序集指定強名稱的公鑰的標記。 這要求公鑰在開發過程當中可用。安全
您能夠在生成時使用延遲簽名或部分簽名,在可遷移可執行 (PE) 文件中爲強名稱簽名保留空間,但要將實際簽名延遲至後面某些階段(一般就在傳送程序集以前)。app
下面的步驟說明了延時對程序集簽名的過程:ide
從將執行最終簽名的單位獲取密鑰對的公鑰部分。 此密鑰一般是 .snk 文件的形式,使用 Windows 軟件開發包 (SDK) 提供的強名稱工具 (Sn.exe) 可建立此文件。函數
使用 System.Reflection 中的兩種自定義特性來批註程序集的源代碼:工具
AssemblyKeyFileAttribute,它將包含公鑰的文件的名稱做爲參數傳遞給其構造函數。測試
AssemblyDelaySignAttribute,它經過將 true 做爲參數傳遞給其構造函數,代表正在使用延遲簽名。 例如:ui
[assembly:AssemblyKeyFileAttribute("myKey.snk")] [assembly:AssemblyDelaySignAttribute(true)]
編譯器將公鑰插入程序集清單,並在 PE 文件中爲完整的強名稱簽名保留空間。 真正的公鑰必須在生成程序集時存儲,以便引用此程序集的其餘程序集可獲取密鑰以存儲在它們自已的程序集引用中。this
因爲程序集沒有有效的強名稱簽名,因此必須關閉該簽名的驗證。 您能夠將「強名稱」工具與 –Vr 選項一塊兒使用來執行此操做。spa
下面的示例關閉名爲 myAssembly.dll 的程序集的驗證。命令行
sn –Vr myAssembly.dll
在沒法運行強名稱工具的平臺上關閉驗證,如高級RISC (ARM) 微處理器,使用 –Vk 選項建立註冊表文件。 導入註冊表文文件到要關閉驗證的計算機上的註冊表。 下面的示例爲建立myAssembly.dll的註冊鍵文件。
sn –Vk myRegFile.reg myAssembly.dll
使用 –Vr 或 –Vk 選項,則可選擇能夠包括測試鍵簽名的 .snk 文件。
當心 |
---|
僅在開發階段使用-Vr or –Vk選項。 將程序集添加到跳過驗證列表會產生安全漏洞。 若是將某程序集添加到跳過驗證列表中,則惡意程序集可使用該程序集的徹底指定程序集名稱來隱藏身份,徹底指定程序集名稱由程序集名稱、版本、區域性和公鑰標記組成。 這使惡意程序集也能夠跳過驗證。 |
說明 |
---|
若是在 64 位計算機上使用 Visual Studio 進行開發的過程當中使用延遲簽名,併爲「Any CPU」編譯程序集,則可能必須應用 -Vr 選項兩次。(在 Visual Studio 中,「Any CPU」是「目標平臺」生成屬性的值;在從命令行進行編譯時,此值是默認值。)若要從命令行或文件資源管理器運行應用程序,請使用 64 位版本的Sn.exe(強名稱工具) 以對程序集應用 -Vr 選項。 若要在設計時將程序集加載到 Visual Studio 中(例如,若是程序集包含應用程序中的其餘程序集所使用的組件),請使用 32 位版本的強名稱工具。 這是由於,在從命令行運行程序集時,實時 (JIT) 編譯器會將程序集編譯爲 64 位本機代碼;在將程序集加載到設計時環境中時,實時 (JIT) 編譯器會將程序集編譯爲 32 位本機代碼。 |
之後,一般是在即將交付前,將程序集提交給組織的簽名機構,以便與「強名稱」工具一塊兒使用 –R 選項來實際進行強名稱簽名。
下面的示例使用 sgKey.snk 密鑰對爲名爲 myAssembly.dll 的程序集簽署強名稱。
sn -R myAssembly.dll sgKey.snk