使用SNK密钥文件保护你的DLL和代码不被反编译教程

 更新时间:2014年09月16日 11:42:15   投稿:junjie  
这篇文章主要介绍了使用SNK密钥文件保护你的DLL和代码不被反编译教程, SNK,作为程序后缀的时候,是.net中的强密匙加密文件,需要的朋友可以参考下

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

复制代码 代码如下:

using System;
namespace ClassLibrary1
{
public class Class1
{
public Class1()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
 
public string Insert()
{
return "ok";
}
}
}

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文件。

相关文章

  • Asp.net MVC中的Http管道事件为什么要以Application_开头(原因解析)

    Asp.net MVC中的Http管道事件为什么要以Application_开头(原因解析)

    在ASP.NET MVC中,为了在API请求结束时释放数据库链接,避免连接池被爆掉,可以通过在Global.asax.cs文件中定义并实现Application_EndRequest方法来实现,本文介绍Asp.net MVC中的Http管道事件为什么要以Application_开头,感兴趣的朋友一起看看吧
    2024-12-12
  • ASP.NET调用WebService服务的方法详解

    ASP.NET调用WebService服务的方法详解

    这篇文章主要介绍了ASP.NET调用WebService服务的方法,较为详细的分析了WebService服务的功能,创建步骤与使用方法,需要的朋友可以参考下
    2016-05-05
  • ASP.NET Core缓存静态资源示例详解

    ASP.NET Core缓存静态资源示例详解

    我们在优化Web服务的时候,对于静态的资源文件,通常都是通过客户端缓存、服务器缓存、CDN缓存,这三种方式来缓解客户端对于Web服务器的连接请求压力的。下面这篇文章主要给大家介绍了关于ASP.NET Core缓存静态资源的相关资料,需要的朋友可以参考下。
    2018-02-02
  • ASP.NET Core处理错误环境

    ASP.NET Core处理错误环境

    这篇文章介绍了ASP.NET Core处理错误环境的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • asp.net程序编译调试时偶尔出现访问被拒绝的错误的解决方法

    asp.net程序编译调试时偶尔出现访问被拒绝的错误的解决方法

    asp.net程序编译调试时偶尔出现访问被拒绝的错误的解决方法...
    2007-04-04
  • .NET中的属性用法分析

    .NET中的属性用法分析

    这篇文章主要介绍了.NET中的属性用法,分析了.NET中属性的功能、定义与具体用法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • 为HttpClient添加默认请求报头的四种解决方案

    为HttpClient添加默认请求报头的四种解决方案

    这篇文章主要给大家介绍了关于为HttpClient添加默认请求报头的四种解决方案,文中通过示例代码介绍的非常详细,对大家学习或者使用HttpClient具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • asp.net中一款极为简单实用的图表插件(jquery)

    asp.net中一款极为简单实用的图表插件(jquery)

    这里介绍一款简单实用的图表插件,该图表插件是基于jquery和jquery的插件 gchart很容易实现的,而gchart插件是封装了google的图表api 。
    2011-07-07
  • asp.net 购物车的实现浅析

    asp.net 购物车的实现浅析

    我从来没有进行过正式的web开发,但是我一直喜欢web,所以这篇文章也是我转行web的一个开始吧。或多或少我也参考了几个网站的实现(当然了,只是看看大概的功能而已),所以也请大家多多指教。
    2011-02-02
  • SqlDataReader生成动态Lambda表达式

    SqlDataReader生成动态Lambda表达式

    这篇文章主要介绍了SqlDataReader生成动态Lambda表达式,需要的朋友可以参考下
    2017-04-04

最新评论