C#程序集使用强名字(Strong Name)签名/强名称签名

C# dll强签名介绍

之前基本没有这个概念,直到有一天我们的dll被反编译了,导致我们的代码基本上被看到了,才想起来要保护dll的安全性,因为C#语言的在编译过程中会产生中间语言导致dll很容易被反编译。暂且先不说如何加密,为了保证dll不被别人随便使用,就首先得对其进行强签名。

为什么使用强名称签名:

通过签发具有强名称的程序集,您可以确保名称的全局唯一性。强名称还特别满足以下要求:
强名称依赖于唯一的密钥对来确保名称的唯一性。任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其他私钥生成的程序集的名称不相同。
强名称保护程序集的版本沿袭。强名称可以确保没有人能够生成您的程序集的后续版本。用户可以确信,他们所加载的程序集的版本出自创建该版本(应用程序是用该版本生成的)的同一个发行者。
强名称提供可靠的完整性检查。通过 .NET 框架安全检查后,即可确信程序集的内容在生成后未被更改过。但请注意,强名称中或强名称本身并不暗含某一级别的信任,例如由数字签名和支持证书提供的信任。
在引用具有强名称的程序集时,您应该能够从中受益,例如版本控制和命名保护。如果此具有强名称的程序集以后引用了具有简单名称的程序集(后者没有这些好 处),则您将失去使用具有强名称的程序集所带来的好处,并依旧会产生 DLL 冲突。因此,具有强名称的程序集只能引用其他具有强名称的程序集。

这里有个介绍的也比较详细:http://blog.csdn.net/donjuan/article/details/3859136 

 

强名称签名的方法:

1.打开“Visual Studio 2008 命令提示”命令行工具。

2. 用Sn.exe 生成一个Public/Private Key Pair 文件:Sn -k test.snk. 如果不指定大小,它的大小就是596 bytes(128 publicKey,32 publicKey Header, 436 PrivateKey)。

3. 添加 [assembly: AssemblyKeyFile(@"test.snk")] 到程序的AssemblyInfo.cs中,也可以在Build Option中指定(/keyfile:test.snk ). 再重新生成test.dll. 在VisualStudio中还可以用工程属性指定.

4. Sn -v test.dll 查一下test.dll是不是已经是一个strongname的程序了,输出:test.dll is valid。表示成功生成了一个具有PublicKey的程序 Sn -T test.dll 可以得到这个assembly的PublickKeyToken。

 

解决第三方DLL没有强签名

创建一个新的随机密钥对:sn -k myTest.snk

第一步: 将DLL文件解开 ildasm myTest.dll /out:myTest.il
第二步: 将签名合入DLL ilasm myTest.il /res:myTest.res /dll /key:myTest.snk /out:myTestSN.dll
第三步: 检查 sn -vf myTestSN.dll

例如:

C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0>ildasm C:/Salien.Utility.V2005.dll /out:C:/Salien.Utility.V2005.il
C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0>ildasm C:/Salien.Utility.V2005.dll /out:C:/Salien.Utility.V2005.il
C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0>ilasm C:/Salien.Utility.V2005.il /res:C:/Salien.Utility.V2005.res /dll /key:C:/Salien.Utility.V2005.snk /out:C:/Salien.Utility.V2005.dll

也可以使用混淆工具,加密工具(MaxToCode、.Net Reactor)等等来实现强签名。


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在.NET/C#中可以使用`RSACryptoServiceProvider`类来实现SHA1WithRSA数字签名和验证。 以下是一个示例代码,展示如何使用`RSACryptoServiceProvider`类在.NET/C#中实现SHA1WithRSA数字签名和验证: ```csharp using System; using System.Security.Cryptography; using System.Text; class Program { static void Main(string[] args) { // 加载私钥 string privateKey = "<RSAKeyValue><Modulus>...</Modulus><Exponent>...</Exponent><P>...</P><Q>...</Q><DP>...</DP><DQ>...</DQ><InverseQ>...</InverseQ><D>...</D></RSAKeyValue>"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(privateKey); // 加载消息 string message = "This is a test message."; // 计算SHA1哈希值 SHA1 sha1 = SHA1.Create(); byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(message)); // 使用RSA私钥对SHA1哈希值进行签名 byte[] signature = rsa.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")); // 打印签名结果 Console.WriteLine("Signature: {0}", BitConverter.ToString(signature)); // 验证签名 bool result = rsa.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), signature); Console.WriteLine("Verification result: {0}", result); } } ``` 在上面的代码中,我们首先加载了RSA私钥,然后计算了消息的SHA1哈希值,最后使用RSA私钥对SHA1哈希值进行签名,并且通过`VerifyHash`方法验证签名是否有效。签名结果可以通过打印`signature`数组来查看。请注意,此示例代码仅用于演示目的,实际使用时需要注意安全性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值