保护你的代码——谁动了我的组件?

原创 2003年10月21日 00:04:00

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

摘要:本文描述了如何用Code Access Security技术来保护代码,使代码不致被恶意调用。

 

 

作为一名.NET开发人员,你没日没夜地写代码,你的组件运行在越来越多的机器上。忽然有一天,你发现你写的组件被引用在别人写的项目里,而且最可气的是,那人竟用你的名义在做破坏它人系统的恶事!你忍不住了,大叫一声Oh shit!,然后打开MSDN,看看有什么办法能帮助你阻止这场阴谋。

 

OK,办法找到了,那就是.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给提取出来。OK,打开你的命令行,定位到密钥文件所在目录并输入以下内容:

 

sn –p Key.snk PublicKey.snk

 

这样,提取出来的公匙信息就被存储在PublicKey.snk文件中。你现在只需把公匙信息读取出来并转化成适当的格式就可以了。这里,你可以使用.NET Framework自带的Secutil.exe工具,但据我所了解,Secutil工具的输出都是数组格式(我在自己的机器上测试了Secutil所提供的全部输出选项,但所得结果都是一样,这让我很感意外,不知大家是否有更好的办法),因此就动手自己写了一个小工具来完成这一读取和转换。大家如果感兴趣可以发邮件给我(因为我没有自己的网络空间可以存放。当然你也可以自己来写,因为它实在是太简单了,就是读取二进制文件)。它的运行界面如图1

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

 ReadKey

 

好了,现在你的代码就被全副武装起来了。试着写一个Console客户端来调用SecureComp,结果怎么样?是不是“无法获得相应权限”?试着用Key.snk给客户端程序签名后再访问,这回可以访问了吧!:)

 

 

结论:适当地应用Code Access Security可以使你的代码被保护起来,不致被第三方不正确调用;但是过多的安全保护也将造成代码运行效率下降,从而带来负面影响。

 

 

由于我也是处在学习过程之中,所以如果文中有错误、解释不彻底或可有更好的解决办法之处,还请大家指教。我的邮件地址是:yanghada@vip.sina.com

保护你的代码——谁动了我的组件?

 作为一名。NET开发人员,你没日没夜地写代码,你的组件运行在越来越多的机器上。忽然有一天,你发现你写的组件被引用在别人写的项目里,而且最可气的是,那人竟用你的名义在做破坏它人系统的恶事!你忍不住了,...
  • nuaalfm
  • nuaalfm
  • 2007年10月27日 00:19
  • 473

保护你的代码——谁动了我的组件?

导读:   作为一名.NET开发人员,你没日没夜地写代码,你的组件运行在越来越多的机器上。忽然有一天,你发现你写的组件被引用在别人写的项目里,而且最可气的是,那人竟用你的名义在做破坏它人系统的恶事!你...
  • fr_fanrong
  • fr_fanrong
  • 2007年10月27日 11:49
  • 295

我是你的谁。你又是谁的谁。

我们似乎都在寻找生命中的那棵可有可无的开满鲜花的树。 但又多少人找到了呢。 或者 这棵树是否有寻找的必要。当我们回过头来发现原来有些时候结果并非那么的重要。 最主要的是我们在寻找的过程中慢慢的释怀了。...
  • strictosidine
  • strictosidine
  • 2011年03月25日 23:38
  • 191

《谁动了我的代码》

本博决定推出《谁动了我的代码》系列文章,文章不定期更新,主要是记录自己在公司的收获和软件方面的些许思考。《谁动了我的代码》标题创意取自于《谁动了我的奶酪》,在这个变化飞快的世界里,我们要做的就是Cha...
  • boluotou
  • boluotou
  • 2009年02月22日 20:19
  • 167

谁动了我的代码?

      今天调试一个游戏逻辑系统时发现前两天做的一些功能失效了,诧异不已。后来查了N久,才发现,被同事改了一段代码。而这段代码是在他的模块响应我这边的模块接口。也许是出于好心,也许是为了规划其模块...
  • skydesign
  • skydesign
  • 2011年01月19日 22:16
  • 305

谁动了我的代码

前两天碰到一个问题,debug版本正常,编译成release版本之后,程序停到一个死循环上了,后面的代码竟然都没了。然后开始没有根据的怀疑,是不是别人的库有问题之类的,然后把别人的库都编译成relea...
  • tracing
  • tracing
  • 2013年05月04日 09:57
  • 857

谁动了我们的DNS

 文章属性:转载文章来源:internet文章提交:root (webmaster_at_xfocus.org)本文遵从GPL协议,欢迎转载|=----------------------------...
  • yjz0065
  • yjz0065
  • 2006年10月16日 14:12
  • 3636

其实,我并不快乐!笑只是为了掩饰心中的痛、沉默是为了不想过多的解释、冷淡是为了保护自己不再受伤害…有谁真正懂我?

其实、我好累了!其实,一直没人懂我! 我习惯假装坚强,习惯了一个人面对所有…我不知道自己到底是怎么了?有时可以很开心的和每一个说话,可以很放肆的开玩笑,可是没人知道那只不过是伪装,很刻意的伪装,其实心...
  • dreamlovezone
  • dreamlovezone
  • 2014年12月13日 10:57
  • 795

JavaScript谁动了你的代码

谁动了我的代码?谁动了我的代码?谁动了我的代码?奇怪的事说三遍!
  • hjwen
  • hjwen
  • 2016年11月30日 21:09
  • 112

谁动了我的代码(1)

  前几天在一家公司看到他们在使用的一个很简单的套打软件,发现那是我写的,仔细一看,又好像不是,认真看过之后,确认是我写的,那个汗啊。那原来是我帮学校写的一个毕业生派遣证的打印,当初应学校的要求,把每...
  • stonecn
  • stonecn
  • 2006年06月07日 02:39
  • 1524
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:保护你的代码——谁动了我的组件?
举报原因:
原因补充:

(最多只允许输入30个字)