民初思韻網

加入收藏   設為首頁
選擇語言   簡體中文
你好,請 登陸 或 注冊
首頁 人文思韻 傳奇人物 歷史思潮 時代作品 話題討論 國民思韻 民初捐助 賬戶管理
  搜索  
    人文精神 >>> 技術話題—商業文明的嶄新時代
字體    

保護你的代碼——誰動了我的組件?
保護你的代碼——誰動了我的組件?
中國IT實驗室收集整理     阅读简体中文版

摘要:本文描述了如何用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所提供的全部輸出選項,但所得結果都是一樣,這讓我很感意外,不知大家是否有更好的辦法),因此就動手自己寫了一個小工具來完成這一讀取和轉換。大家如果感興趣可以發郵件給我(因為我沒有自己的網絡空間可以存放。當然你也可以自己來寫,因為它實在是太簡單了,就是讀取二進制文件)。

  好了,現在你的代碼就被全副武裝起來了。試著寫一個Console客戶端來調用SecureComp,結果怎么樣?是不是“無法獲得相應權限”?試著用Key.snk給客戶端程序簽名后再訪問,這回可以訪問了吧!:)

  結論:適當地應用Code Access Security可以使你的代碼被保護起來,不致被第三方不正確調用;但是過多的安全保護也將造成代碼運行效率下降,從而帶來負面影響。

  

2011-02-23 05:03

歡迎訂閱我們的微信公眾賬號!
春秋茶館訂閱號
微信號 season-tea(春秋茶館)
每天分享一篇科技/遊戲/人文類的資訊,點綴生活,啟迪思想,探討古典韻味。
  清末民初歷史人物  民初人物
孫中山的啟蒙者
近現代的嶺南,湧現出大批引領中國前行的先驅者,近代改良主義者,香港華人領袖何啟便是其中的一位。他不僅是孫中山在香港西醫書院的老師,更是孫中山走向革命道路的思想導師。
革命先行者民國之父
孫中山(1866年11月12日-1925年3月12日),本名孫文,字載之,號日新、逸仙,廣東香山(今中山)人,是醫師、近代中國的民主革命家、中國國民黨總理、第一任中華民國....
資助民初精神網
        回頂部     寫評論

 
評論集
暫無評論!
發表評論歡迎你的評論
昵稱:     登陸  註冊
主頁:  
郵箱:  (僅管理員可見)

驗證:   验证码(不區分大小寫)  
© 2011   民初思韻網-清末民初傳奇時代的發現與復興   版權所有   加入收藏    設為首頁    聯繫我們    1616導航