首页> 中国专利> 一种提高软件系统安全性的软件热插拔方法

一种提高软件系统安全性的软件热插拔方法

摘要

本发明提供的是一种提高软件系统安全性的软件热插拔方法。利用面向对象语言的多态性,提出中间接口表技术、类冗余文件包的概念。全局代理:中间接口表由全局代理维护,表中的每个元素的键值为接口名,返回值为该接口类的对象。监视器:存在于全局代理中,对软件主体和类冗余文件包中每一对对应的类文件进行监视。软件主体:即软件编译后的结构目录。类冗余文件包:这个包的目录结构与软件主体的目录结构完全相同,只是根目录不同。本发明的优点有:能够加强系统的自我保护能力从而提高系统的安全性;提出中间接口表技术,维护一个结构相对简单的表并使软件的结构更加清晰与易于管理;只使用一个全局代理,降低了系统开销。

著录项

  • 公开/公告号CN101369228A

    专利类型发明专利

  • 公开/公告日2009-02-18

    原文格式PDF

  • 申请/专利权人 哈尔滨工程大学;

    申请/专利号CN200810137322.5

  • 发明设计人 王慧强;董玺坤;周玉新;王海峰;

    申请日2008-10-14

  • 分类号G06F9/44;G06F21/00;

  • 代理机构

  • 代理人

  • 地址 150001 黑龙江省哈尔滨市南岗区南通大街145号1号楼哈尔滨工程大学科技处知识产权办公室

  • 入库时间 2023-12-17 21:27:57

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-10-09

    未缴年费专利权终止 IPC(主分类):G06F9/44 授权公告日:20110420 终止日期:20171014 申请日:20081014

    专利权的终止

  • 2011-06-01

    著录事项变更 IPC(主分类):G06F9/44 变更前: 变更后: 申请日:20081014

    著录事项变更

  • 2011-04-20

    授权

    授权

  • 2009-04-15

    实质审查的生效

    实质审查的生效

  • 2009-02-18

    公开

    公开

说明书

(一)技术领域

本发明涉及的是一种软件热插拔方法,尤其是基于中间接口表技术的软件热插拔方法。

(二)背景技术

随着计算机性能的不断提升,计算机系统变得越来越复杂。软件系统复杂性的增加给系统的配置和维护带来很大的困难,很多系统和软件的维护工作需要经过特殊培训的人员才能完成。并且系统的复杂性仍然在不断的提升。许多软件系统需要为客户提供不间断服务,软件的动态升级技术因此成为当今软件维护领域的一个重要研究课题。

软件热插拔概念是基于软件动态升级的需求提出的,但是由于软件系统的高复杂性及各种条件的限制,国内外相关研究并不多。比较有代表性的文章只有《Enabling autonomic behavior in systems software with hot swapping》(IBMSYSTEMS JOURNAL,VOL 42,NO 1,2003)(译:《利用热插拔技术实现软件系统的自律行为》(IBM系统期刊第42卷,第1期,2003年)),《SwapBox:aHot-Swapping Framework for Swappable JavaBeans》(In Proc.of the 6thInternational Workshop on Component-Oriented Programming-WCOP 2001 at the15th European Conference on Object-Oriented Programming-ECOOP 2001(Budapest,Hungary,June 2001).On-line at:http://www.research.microsoft.com/~cszypers/events/WCOP2001/Esfandiari.doc)(译:《SwapBox:一种可交换JavaBeans的热交换框架》(第十五届面向对象程序设计欧洲会议第六届面向组件程序设计国际会议(布达佩斯,匈牙利,2001年6月)))以及《Dynamic evolution of network management software by softwarehot-swapping》(Integrated Network Management Proceedings,2001 IEEE/IFIPInternational Symposium on,14-18 May 2001 Page(s):63-76)(译:《利用软件热插拔技术实现网络管理软件的动态演化》(2001年度IEEE/IFIP国际学术会议集成网络管理专题讨论会,2001年5月14日—18日,63—76页))三篇提出了具体的软件热插拔方法。《Enabling autonomic behavior in systems software with hotswapping》的热插拔实验中,采用对象翻译表解决功能对象引用的透明性问题,该表维护某对象对其他对象的所有引用指针,表的结构较为复杂并且对指针的维护存在隐患。SwapBox文章中提出的方法需修改BeanBox(BeanBox是BDK中自带的一个用于测试Beans的工具,可以用它可视地管理Beans的属性和事件)。BeanBox只是一个测试工具,修改后的SwapBox仍是一个测试工具,因此该方法没有实际应用价值。第三篇文章提出的方法采用代理模式,为每个功能模块配置相应的代理,解决了客户引用透明性问题,该方法的缺点是,维护与功能模块数量相同的Proxy所产生的系统开销很大,甚至可能超过系统本身。上海交大的梁哲聪在其硕士论文中提到了标准面向对象编程思想——用接口实现对象引用透明,但是并没有用到表的概念(这与本发明在实际操作中很不相同,其文中提到的表用来做状态传递而非热插拔动作),而且直接通过接口访问对象在实现热插拔时会遇到很多技术问题在该文中也并没有说明解决办法,如动态编译等。其它的文章都是针对现有方法提出的一些系统模型和约束条件等。

软件热插拔只是一种概念,其实现方法并不唯一,现有的热插拔方法并不完善。如没有考虑软件安全性等因素;系统开销过大,占用资源甚至超过系统本身;实现方法较复杂,如需修Java虚拟机等。

(三)发明内容

本发明的目的在于提供一种能够加强系统的自我保护能力从而提高系统的安全性;使软件的结构更加清晰与易于管理;降低系统开销的一种提高软件系统安全性的软件热插拔方法。

本发明的目的是这样实现的:

1)将目标系统中每个类的公有方法和公有变量抽象为一个接口,存放于一个接口文件夹中,每个类实现对应的接口;

2)通过对接口文件夹的遍历,以接口名为键值,该接口类实例为返回值,建立一个包含所有接口的中间接口表;

3)调用者提出对被调用类的访问要求,中间接口表屏蔽直接访问,处理该请求;

4)中间接口表通过被调用类接口的名字,查找匹配的键值;

5)若为首次访问该接口,转步骤6);若非首次访问,转步骤9);

6)中间接口表问询监视器,判断软件主体和类冗余文件包中的对应文件的大小以及修改日期是否发生变化,只要发生文件改变,转步骤7);若无文件改变,转步骤8);

7)中间接口表调用类定位方法,将接口重定向于类冗余文件包中实现该接口的类,将其载入内存并返回该类的实例,转步骤12);

8)将软件主体中实现该接口的类载入内存并返回其实例,转步骤12);

9)判断接口定向:若接口定向于软件主体中的类文件,重复6)~8);若接口定向于类冗余文件包中的类文件,转步骤10);

10)只检查类冗余文件包中的类文件的大小以及修改日期是否发生变化:如发生变化,视为系统的升级操作,动态编译该文件并将其载入内存;如未发生变化,转步骤11);

11)返回类冗余文件包中实现该接口的类实例,转步骤12);

12)系统继续向下执行。

本发明利用面向对象语言的多态性,提出中间接口表技术,并提出类冗余文件包的概念。需将软件中的每一个类都抽象成一个接口。能够使用本热插拔方法的软件应具有如附图1所示的体系结构。包括一个全局代理、软件主体以及一个类冗余文件包。接下来对各部分进行详细说明。

全局代理:中间接口表由全局代理维护,表中的每个元素的键值为接口名,返回值为该接口类的对象。它能够接收监视器传来的消息,然后对发生变化的类做接口重定向操作。

监视器:存在于全局代理中,对软件主体和类冗余文件包中每一对对应的类文件进行监视。当发现软件主体或者类冗余文件包中任何一个类文件发生变化时,通知代理做接口重定向操作。

软件主体:即软件编译后的结构目录。

类冗余文件包:这个包的目录结构与软件主体的目录结构完全相同,只是根目录不同。而之所以将其称为类冗余文件包,是因为它并非软件主体完全的冗余,它只是目录结构与软件主体相同,相对应的文件名相同,而文件内容可以不同(在系统运行的最初是相同的),以便完成文件的升级。

本发明基于软件热插拔的特点将其用于提高系统安全性,迄今为止还没有人涉足这一领域。并且,提出了一种新的软件热插拔方法以及适用该方法的软件应满足的条件,经验证,该方法具有一定的实用价值和发展前景。相对于现有的软件热插拔方法,本发明的优点有:(1)本方法能用于容忍软件被攻击、某些程序文件被恶意修改等破坏并采取对应防护行为,能够加强系统的自我保护能力从而提高系统的安全性,现有的软件热插拔方法均未考虑或被用来提高软件系统的安全性;(2)不同于现有的热插拔方法,提出中间接口表技术,维护一个结构相对简单的表并使软件的结构更加清晰与易于管理;(3)不同于现有的热插拔方法,只使用一个全局代理,降低了系统开销。

(四)附图说明

图1为应用本方法的软件体系结构。

图2为本发明的流程图。

(五)具体实施方式

下面结合附图举例对本发明做更详细地描述:

结合图2,本发明的提高软件系统安全性的软件热插拔方法的工作流程如下:

1)将系统中每个类的公有方法和公有变量抽象为一个接口,存放于一个接口文件夹中,每个类实现对应的接口;

2)通过对接口文件夹的遍历,以接口名为键值,该接口类实例为返回值,建立一个包含所有接口的中间接口表;

3)调用者提出对被调用类的访问要求,中间接口表屏蔽直接访问,处理该请求;

4)中间接口表通过被调用类接口的名字,查找匹配的键值;

5)若为首次访问该接口,转步骤6);若非首次访问,转步骤9);

6)中间接口表问询监视器,判断软件主体和类冗余文件包中的对应文件的大小以及修改日期是否发生变化。若软件主体中的文件发生改变,说明系统受到了攻击,因为正常情况下软件主体中的文件是不允许修改的;若类冗余文件包中的文件发生变化,说明管理员对系统进行了升级。(类冗余文件包的路径是隐蔽的,由系统管理员维护)只要发生文件改变,转步骤7);若无文件改变,转步骤8);

7)中间接口表调用类定位方法,将接口重定向于类冗余文件包中实现该接口的类,将其载入内存并返回该类的实例,转步骤12);

8)将软件主体中实现该接口的类载入内存并返回其实例,转步骤12);

9)判断接口定向:若接口定向于软件主体中的类文件,重复6)~8);若接口定向于类冗余文件包中的类文件,转步骤10);

10)只检查类冗余文件包中的类文件的大小以及修改日期是否发生变化:如发生变化,视为系统的升级操作,动态编译该文件并将其载入内存;如未发生变化,转步骤11);

11)返回类冗余文件包中实现该接口的类实例,转步骤12);

12)系统继续向下执行。

本发明的方法需要如附图1所示的软件体系结构支持,访问者通过代理中的中间接口表访问被调用者,中间接口表屏蔽接口重定向,完成热插拔操作。中间接口表中的接口不同于普通编程中的接口,普通编程中的接口是在程序设计时先设计接口,再设计实现接口的类,而中间接口表中的接口是在类设计完成时对一个类的抽象。中间接口表技术不影响类对其它普通接口的实现。

虽然要实现通过代理访问对象,但是要做到良好封装,使调用时尽量简洁,示例代码中调用如下所示:

Sort s1=(Sort)myProxy.createSpecialInstance("Sort");

s1.sortImpl();

s1.sortMethod();

隐藏中间接口表等复杂操作,只留给用户一个createSpecialInstance()方法显式调用,之后对实例的操作便与普通程序相同。

实施例将中间接口表封装于createSpecialInstance()中,一系列的热插拔逻辑与操作都在这里实现。能在出现软件主体中文件被修改的攻击行为,以及冗余文件包中文件被修改或java文件被修改等升级操作的情况下,实现以类文件为单位的软件热插拔。该方法示例代码如下:

String className;

className=htForClassName.get(interfaceName).toString();

Object o=this.htForLoadedClass.get("swap."+className);

if(o==null)

{

     Object o1=this.htForLoadedClass.get("src."+className);

     if(o1==null)

     {

     if(this.monitor("src",className)&&this.monitor("swap",className))

          {

              o1=myClassLoader.load("src","src."+className);

              this.htForLoadedClass.put("src."+className,o1);

              return o1;

          }

          else

          {

              o=myClassLoader.load("swap","swap."+className);

              this.htForLoadedClass.put("swap."+className,o);

              return o;

          }

     }

     else

     {

     if(this.monitor("src",className)&&this.monitor("swap",className))

                              return o1;

         else

         {

             o=myClassLoader.load("swap","swap."+className);

             this.htForLoadedClass.put("swap."+className,o);

             return o;

         }

     }

}

else

{

          String[]args2={"C:/Documents and

          Settings/Administrator/workspace/Impl/swap/"+className+

          ".java"};

          StringWriter err=new StringWriter();

          PrintWriter errPrinter=new PrintWriter(err);

          String args 1[]=buildJavacArgs(args2);

          int resultCode=com.sun.tools.javac.Main.compile(argsl,

          errPrinter);

          errPrinter.close();

          o=myClassLoader.load("swap","swap."+className);

          this.htForLoadedClass.put("swap."+className,o);

          return o;

}

其中需要用到的辅助方法有monitor()、buildJavacArgs()等。Monitor()方法为监视器的被动实现,负责监视文件是否发生变化,其部分示例代码如下:

modifiedTime=f.lastModified();

if(((String)htForClassTime.get(packages+"."+

className)).equals(Long.toString(modifiedTime)))

    return true;

else

    return false;

buildJavacArgs()方法功能为当某类文件源代码发生改变时,将其动态编译,其部分示例代码如下:

ArrayList args=new ArrayList();

for(int i=0;i<srcFiles.length;i++)

{

   args.add(srcFiles[i]);

}

returnargs.toArray(new String[args.size()]);

本实施例是对本发明的验证性实现,证明了本方法能够在软件被恶意修改及动态升级时能够实现软件热插拔,提高了软件的安全性并兼容了软件动态升级的需求。本实施例只是本发明的一种简单实现,并非最优,仅供验证之用(如未实现主动周期性监视等)。现有方法中已提出很多传递状态的方案,本方法采用了java反射机制来进行状态传递。实验结果表明,本方法切实有效,达到了预期效果。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号