保护你的DLL和Code不被别人使用。

简介:

 大家做项目开发一般都是分层的,比如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,代码如下:

 1 using System;
 2
 3 namespace ClassLibrary1
 4 {
 5    public class Class1
 6    {
 7        public Class1()
 8        {
 9            //
10            // TODO: 在此处添加构造函数逻辑
11            //
12        }

13
14        public string Insert()
15        {
16            return "ok";
17        }

18    }

19}

20

AssemblyInfo.cs代码:
//............其他的就用默认
[assembly: AssemblyKeyFile("c:\\test.snk")]   // 连接上面用强命名工具SN.exe生成的文件.

接着创建个WindowApplication来调用我们的ClassLibrary1,代码:
private  void button1_Click( object sender, System.EventArgs e)
{
    MessageBox.Show( new ClassLibrary1.Class1().Insert());
}
不修改WindowApplication的AssemblyInfo.cs。
在这里就可以直接运行了,不过大家都看的出来,这样是能成功调用Class1中的方法的。

现在让我们来修改下Class1.cs,代码:

using System;
using System.Security.Permissions;


namespace ClassLibrary1
{
    [StrongNameIdentityPermissionAttribute(SecurityAction.LinkDemand, PublicKey = 
         "00240000048000009400000006020000002400005253413100040000010001000551684edd1600"+
         "8ccbdd337b1cf1490490d97fe0048c5f3629cc4f5104578499eace9b2a94115022edd620def472"+
         "8b4f088291cfa77a40659afba611fdafbb7894b93a64049d439936bd0cd8dc0704625aeb735892"+
         "e9eb3f910a49a2925af10515d935654d7adac5567ff6d780d23d587de0ff4d271da7b30680fa88"+
         "a47a4ba4")]
     public  class Class1
    {
         public Class1()
        {
             //
            
//  TODO: 在此处添加构造函数逻辑
            
//
        }

         public  string Insert()
        {
             return "ok";
        }
    }
}

然后再编译后运行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盘。
不然会出错^_^。
http://files.cnblogs.com/BearsTaR/Solution1.rar










本文转自BearRui(AK-47)博客园博客,原文链接:   http://www.cnblogs.com/BearsTaR/archive/2006/05/25/ProtectDll.html ,如需转载请自行联系原作者


相关文章
|
7月前
2024年全国数学建模B题赛后感
2024年参加全国大学生数学建模比赛,我们选择了B题。然而,团队中只有我真正参与解题,其他成员因缺乏相关知识几乎无法协助。三天三夜,我独自完成代码、论文撰写等工作,期间经历了数据调试与参数优化的艰难过程。尽管最终提交时发现忘了写标题,但幸运地获得省一等奖。这次经历虽累,但也让我明白团队协作和赛前准备的重要性,成果来之不易,努力终有回报!
166 1
|
3月前
|
人工智能 监控 数据可视化
基于YOLOv8的无人机位置捕捉识别项目|完整源码数据集
本项目基于YOLOv8构建无人机目标检测系统,集成PyQt5图形界面,支持图像、视频、摄像头等多种输入方式,具备高精度识别与实时检测能力,适用于安防监控、目标跟踪等场景。含完整训练代码、数据集及部署教程,开箱即用,适合AI学习与工程实践。
基于YOLOv8的无人机位置捕捉识别项目|完整源码数据集
|
9月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
581 14
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙的竞争力到底如何?
长期以来,移动操作系统市场被IOS和安卓所垄断,一直都难以推出完整的自主系统,面临诸多挑战,如推广困难、应用适配难度大,以及技术底座缺乏自主性。但原生鸿蒙操作系统展示其在突破这些瓶颈方面的努力,基于安全牢固的“鸿蒙内核”,上层应用的开发与创新得以实现,不再被卡脖子,更不牵制于外界。本身该系统在OS内核、框架、数据库等方面进行全面自研,实现真正的自主可控。
412 3
|
网络协议 Java Linux
如何解决“连接超时”的问题
当遇到“连接超时”问题时,可尝试以下方法:检查网络连接、重启路由器、清除浏览器缓存、关闭防火墙或杀毒软件、更改DNS服务器等。若问题依旧,建议联系网络服务提供商或技术人员寻求帮助。
4914 6
|
Java Android开发 Spring
Android Spingboot 实现SSE通信案例
【7月更文挑战第14天】以下是使用Android和Spring Boot实现SSE(Server-Sent Events)通信的案例摘要: 在`MainActivity`中: - 初始化界面元素并设置按钮点击事件。 - `startSseRequest`方法创建`WebClient`对象,设置请求头,发送请求,并处理响应和错误。 请确保将`your-server-url`替换为实际的服务器地址。
539 14
|
存储 安全
atomic_int
atomic_int
600 0
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
1190 0
|
并行计算 Linux iOS开发
llamafile:单个文件分发和运行LLM
为了方便更多的零基础的初学者体验大语言模型,llamafile 提出了单文件运行大模型的方案。