保护我们的代码安全

本文介绍了.NET平台的Code Access Security,可通过继承CodeAccessPermission的类实现代码安全控制。以StrongNameIdentityPermissionAttribute类为例,将组件与强名称绑定,防止第三方恶意调用。还提及提取公钥的方法,强调保护密钥文件及延迟签名的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.NET平台提供的Code Access Security。有大量继承于CodeAccessPermission的类可以帮你实现不同方面、不同范围的代码安全控制。使用StrongNameIdentityPermissionAttribute类,这个类允许你将组件(或类、方法)与某一强名称(通常就是你发布程序时所用的强名称)绑定,这样,只有在客户端程序具有该强名称签名的情况下才能使用你的组件。也就是说,除了你自己编写的客户端代码因为拥有同样的签名而被允许使用组件以外,任何第三方代码都无法通过StrongNameIdentityPermissionAttribute的防护,因此也就无法恶意调用你的组件了。 

为了简便起见,先创建一个很简单的Class Library项目,代码如下:

 

// SecureComp.dll

using System;

 

namespace musicland

{   

     public class SecureComp

     {

         public string Confidential()

         {

              return "This is confidential!";

         }

     }

}

 

现在的这个组件任何人都可以写代码来调用它。下面,进入正题 

首先引入System.Security.Permissions命名空间:

 

using System.Security.Permissions;

 

然后,在组件级加上StrongNameIdentityPermissionAttribute属性:

 

[assembly: StrongNameIdentityPermissionAttribute(SecurityAction.RequestMinimum,

    PublicKey="0024000004800000940000000602000000240000525341310004000001000100c11c8497d+

283259f23d645358d65812b69136846b03a7d15124545fc3ed27d89d1330cceda4232c7bc6e8a0e7ecd857f8+

126d0859e2300237b3cab6f7737a92f585cbf2afb4b475c537703efb96e17e5921ff00c6e022b22f3d772f14+

6a3a5c7f6ccad3131b8d0465e6709e5a28cc3ca1c8b610af4162c1a18c0feb8e6993ab1")]

namespace musicland

 

注意,这里使用了SecurityAction.RequestMinimum,这申明除非获得StrongNameIdentityPermissionAttribute所表明的资源访问权限(即对SecureComp.dll组件的访问权限,可以把SecureComp.dll看作一样资源),否则CLR不会准许调用方(即客户端代码)访问所请求的资源;此外,在PublicKey属性中加入了你所允许的公匙(Public Key)的十六进制表示(转化成字符串类型)CRL在运行期间将依照这一段公匙来判断调用方是否合法,除非调用方拥有相应的私匙(Private Key),否则将无法访问。看来,平时一定要倍加保护你的密钥文件,因为密钥文件(特别是private key)的泄露将会成为你无尽恶梦的根源,而延迟签名(delay signing)在这里也就显得格外重要了:.)

 

这长长的一串PublicKey是怎么得出来的?打开Sn.exe工具,通过它就可以把PublicKey给提取出来。打开你的命令行,定位到密钥文件所在目录并输入以下内容:

 

sn –p Key.snk PublicKey.snk

 

这样,提取出来的公匙信息就被存储在PublicKey.snk文件中。现在只需把公匙信息读取出来并转化成适当的格式就可以了。可以使用.NET Framework自带的Secutil.exe工具,但据我所了解,Secutil工具的输出都是数组格式(我在自己的机器上测试了Secutil所提供的全部输出选项,但所得结果都是一样,现在你的代码就被保护起来了。试着写一个Console客户端来调用SecureComp,结果是“无法获得相应权限”?试着用Key.snk给客户端程序签名后再访问,然后就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值