你们作项目开发通常都是分层的,好比UI层,业务层,数据访问层。业务层引用数据访问层的DLL(好比dataAccess.dll),并使用dataAccess.dll中的方法。当项目完成并给客户用了,可有些内心BT的客户这个时候也能够请个稍微懂NET的人来引用你的dataAccess.dll并调用其中的方法搞破坏。好比能够直接使用里面的ChangePwd(string UserName,string Pwd)方法把其余用户的密码改了,这个时候就你就.......
好了,该开始说怎么保护咱们的代码了:
首先咱们须要把咱们的程序集作成强命名的程序集。
这里咱们在.NET 命令提示中输入sn -k c:\test.snk 建立一个新的随机密钥对并将其存储在 c:\test.snk
中
而后新创建类库ClassLibrary1,里面只有个类文件Class1.cs,代码以下:
app
AssemblyInfo.cs代码:
//............其余的就用默认
[assembly: AssemblyKeyFile("c:\\test.snk")] // 链接上面用强命名工具SN.exe生成的文件.
接着建立个WindowApplication来调用咱们的ClassLibrary1,代码:函数
不修改WindowApplication的AssemblyInfo.cs。
在这里就能够直接运行了,不过你们都看的出来,这样是能成功调用Class1中的方法的。
如今让咱们来修改下Class1.cs,代码:工具
而后再编译后运行windowapplication调用class1中的方法就会出错。
这里的StrongNameIdentityPermissionAttribute是NET提供的CAS(Code Access Security)中的1个类,具体可参考MSDN,SecurityAction.LinkDemand 是要求直接调用方已被授予了指定的权限,这里即windowapplication要授予了权限才行,若是使用SecurityAction.Demand要求调用堆栈中的全部高级调用方都已被授予了当前权限对象所指定的权限。他们的区别是:若是windowapplication已受权访问,而还有个windowapplication2(未受权访问)经过调用windowapplication中的button1_Click方法来调用class1,这个时候若是使用SecurityAction.LinkDemand就能成功调用,而使用SecurityAction.Demand windowapplication2就不能调用,windowapplication 在这2种状况下都能调用。
说到这里你们必定再问PublicKey=后面一串那么长的字符串怎么来。PublicKey后面的字符串是你开始生成的c:\test.snk文件中保存的公钥。那怎么才能看到这个公钥了,照样是用SN.EXE。
输入sn -p c:\test.snk c:\publicKey.snk (从 test.snk
中提取公钥并将其存储在 publicKey.snk
中)
再输入sn -tp c:\publicKey.snk (显示公钥信息)
上面这个命令就能看到PublicKey后面的字符串了,还想什么啊,把那字符串copy下来啊。
最后你们必定在关心这个时候windowapplication 要怎么调用class1了,其实也简单,只要把windowapplication 的AssemblyInfo.cs修改成:
[assembly: AssemblyKeyFile("c:\\test.snk")]
到这里就一切OK了,你们都看到最关键的就是test.snk文件了,因此必定要保护好你本身的test.snk文件。
下面是个人代码,你们能够下载看看,在使用的时候记的要把我KEY文件夹下的test.snk copy到c盘。
否则会出错^_^。ui
[做者]:BearRui(AK-47)
[博客]: http://www.cnblogs.com/BearsTaR/
[声明]:本博全部文章版权归做者全部(除特殊说明之外),转载请注明出处.spa