强签名(Strong Name)使用教程
本教程详细介绍 .NET 强签名的作用,以及恒盾C#混淆加密大师中强签名功能的使用方法和注意事项,帮助开发者在混淆处理后保持程序集标识一致、通过完整性校验。
什么是强签名
强签名(Strong Name)是 .NET 平台为程序集提供的一种签名机制,通过一对公私钥(保存在 .snk 密钥文件中)为程序集生成数字签名。它的作用主要体现在三个方面:
- 唯一标识:强名称由程序集名称、版本号、区域性和公钥标记(Public Key Token)共同组成。使用不同密钥签名的同名程序集可以共存,避免与第三方类库发生命名冲突。
- 防篡改校验:强签名与程序集内容绑定。文件被修改后,签名校验将无法通过,可以用于发现程序集是否被篡改。
- 引用绑定:当一个强签名程序集引用另一个强签名程序集时,运行时会按"简单名称 + 公钥标记"进行绑定。密钥一致,引用才能正常加载。
需要注意的是,强签名解决的是"程序集是谁、是否被改动"的问题,它不等于混淆和加密,也不能替代代码保护功能。两者配合使用,才能同时满足"防篡改"和"难反编译"的需求。
为什么混淆后需要重新签名
如果输入的 DLL 或 EXE 本身是强签名程序集,混淆处理完成后,文件内容已经发生变化,原有的强名称签名随之失效。此时会出现两类问题:
- 引用加载失败:其他程序集在编译时记录了对你的 DLL 的强名称引用。签名失效或公钥标记变化后,运行时可能抛出找不到程序集或加载失败的异常。
- 无法通过强名称校验:需要放入 GAC 或接受签名校验的场合,签名失效的文件会被直接拒绝。
通过强签名功能,使用与原始程序集相同的 .snk 密钥重新签名,公钥标记保持不变,其他程序集的引用关系得以延续。这也是启用该功能最常见的原因。
如果原始程序本来没有强签名,也可以借助该功能为输出文件补上强签名,例如后续需要将 DLL 安装到 GAC,或公司规范要求所有程序集必须签名时。
如何生成强名称密钥文件
强签名需要 .snk 格式的密钥文件。如果项目中已有密钥文件(例如编译时用于签名的 xxx.snk),直接使用该文件即可。常见的生成方式有两种: