保護你的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,代碼以下:
app

 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盤。
否則會出錯^_^。
ui

[做者]:BearRui(AK-47)
[博客]: http://www.cnblogs.com/BearsTaR/
[聲明]:本博全部文章版權歸做者全部(除特殊說明之外),轉載請註明出處.
spa

相關文章
相關標籤/搜索