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

文档序号:6466000阅读:228来源:国知局
专利名称:一种提高软件系统安全性的软件热插拔方法
技术领域
本发明涉及的是一种软件热插拔方法,尤其是基于中间接口表技术的软件热 插拔方法。
(二)
背景技术
随着计算机性能的不断提升,计算机系统变得越来越复杂。软件系统复杂性 的增加给系统的配置和维护带来很大的困难,很多系统和软件的维护工作需要经 过特殊培训的人员才能完成。并且系统的复杂性仍然在不断的提升。许多软件系 统需要为客户提供不间断服务,软件的动态升级技术因此成为当今软件维护领域 的一个重要研究课题。
软件热插拔概念是基于软件动态升级的需求提出的,但是由于软件系统的高 复杂性及各种条件的限制,国内外相关研究并不多。比较有代表性的文章只有 《Enabling autonomic behavior in systems software with hot swapping》(IBM SYSTEMS JOURNAL, VOL 42, NO 1, 2003)(译《利用热插拔技术实现软件系 统的自律行为》(IBM系统期刊第42巻,第1期,2003年)),《SwapBox: a Hot-Swapping Framework for Swappable JavaBeans》 (In Proc. of the 6th International Workshop on Component-Oriented Programming —WCOP 2001 at the 15th 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 software hot-swapping》(Integrated Network Management Proceedings, 2001 IEEE/IFIP International Symposium on, 14-18 May 2001 Page(s):63 - 76)(译:《利用软件热 插拔技术实现网络管理软件的动态演化》(200l年度IEEE/IFIP国际学术会议集 成网络管理专题讨论会,2001年5月14日一18日,63—76页))三篇提出了具
体的软件热插拔方法。《Enabling autonomic behavior in systems software with hot swapping》的热插拔实验中,采用对象翻译表解决功能对象引用的透明性问题, 该表维护某对象对其他对象的所有引用指针,表的结构较为复杂并且对指针的维 护存在隐患。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) 只检查类冗余文件包中的类文件的大小以及修改日期是否发生变化如 发生变化,视为系统的升级操作,动态编译该文件并将其载入内存;如未发生变 化,转步骤ll);
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) 只检査类冗余文件包中的类文件的大小以及修改日期是否发生变化如 发生变化,视为系统的升级操作,动态编译该文件并将其载入内存;如未发生变 化,转步骤ll);
11) 返回类冗余文件包中实现该接口的类实例,转步骤12);
12) 系统继续向下执行。
本发明的方法需要如附图1所示的软件体系结构支持,访问者通过代理中的 中间接口表访问被调用者,中间接口表屏蔽接口重定向,完成热插拔操作。中间 接口表中的接口不同于普通编程中的接口 ,普通编程中的接口是在程序设计时先 设计接口,再设计实现接口的类,而中间接口表中的接口是在类设计完成时对一 个类的抽象。中间接口表技术不影响类对其它普通接口的实现。
虽然要实现通过代理访问对象,但是要做到良好封装,使调用时尽量简洁, 示例代码中调用如下所示
Sort sl = (Sort)myProxy.createSpecialInstance("Sort");
sl.sortlmpl();
sl.sortMethod();
隐藏中间接口表等复杂操作,只留给用户一个createSpecialInstance ()方法 显式调用,之后对实例的操作便与普通程序相同。
实施例将中间接口表封装于createSpecialInstance ()中, 一系列的热插拔逻 辑与操作都在这里实现。能在出现软件主体中文件被修改的攻击行为,以及冗余 文件包中文件被修改或Java文件被修改等升级操作的情况下,实现以类文件为 单位的软件热插拔。该方法示例代码如下 String classNam:
className = htForClassName.get(interfaceName).toString(); Object o = this.htForLoadedClass.get("swap." + className); if(o==null)
Object ol = this.htForLoadedClass.get("src." + className); if(ol==null)
{
if(this.monitor("src", className)&&this.monitor("swap", className))
ol = myClassLoader.load("src" ,"src," + className); this.htForLoadedClass.put("src." + className,ol); return ol^
else
o = myClassLoader.load("swap" ,',swap." + className); this.htForLoadedClass.put("swap." + className,o); return o;
else if(this else
o = myClassLoader.load("swap" ,"swap." + className); this.htForLoadedClass.put("swap." + className,o); return o;
■monitor(',src", className)&&this.monitor("swap", className)) return ol;
else
String[] args2 ={"C:/Documents and
Settings/Administrator/workspace/Impl/swap/" + className + "Java" ^
String Writer err = new String Writer();
Print Writer errPrinter = new Print Writer(err);
String argsl[] = buildJavacArgs(args2);
int resultCode = com.sun.tools.javac,Main,cj^7e(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.fo5W"g(modifiedTime))) return true;
else
return false;
buildJavacArgs ()方法功能为当某类文件源代码发生改变时,将其动态编译,
其部分示例代码如下
ArrayList args = new ArrayList(); for (int i = 0; i < srcFiles.length; i++)
args.add(srcFiles[i]); return (String[]) args.toArray(new String[args.size()]);
本实施例是对本发明的验证性实现,证明了本方法能够在软件被恶意修改及 动态升级时能够实现软件热插拔,提高了软件的安全性并兼容了软件动态升级的 需求。本实施例只是本发明的一种简单实现,并非最优,仅供验证之用(如未实 现主动周期性监视等)。现有方法中己提出很多传递状态的方案,本方法采用了 java反射机制来进行状态传递。实验结果表明,本方法切实有效,达到了预期效 果。
权利要求
1.一种提高软件系统安全性的软件热插拔方法,其特征是1)将目标系统中每个类的公有方法和公有变量抽象为一个接口,存放于一个接口文件夹中,每个类实现对应的接口;2)通过对接口文件夹的遍历,以接口名为键值,该接口类实例为返回值,建立一个包含所有接口的中间接口表;3)调用者提出对被调用类的访问要求,中间接口表屏蔽直接访问,处理该请求;4)中间接口表通过被调用类接口的名字,查找匹配的键值;5)若为首次访问该接口,转步骤6);若非首次访问,转步骤9);6)中间接口表问询监视器,判断软件主体和类冗余文件包中的对应文件的大小以及修改日期是否发生变化,只要发生文件改变,转步骤7);若无文件改变,转步骤8);7)中间接口表调用类定位方法,将接口重定向于类冗余文件包中实现该接口的类,将其载入内存并返回该类的实例,转步骤12);8)将软件主体中实现该接口的类载入内存并返回其实例,转步骤12);9)判断接口定向若接口定向于软件主体中的类文件,重复6)~8);若接口定向于类冗余文件包中的类文件,转步骤10);10)只检查类冗余文件包中的类文件的大小以及修改日期是否发生变化如发生变化,视为系统的升级操作,动态编译该文件并将其载入内存;如未发生变化,转步骤11);11)返回类冗余文件包中实现该接口的类实例,转步骤12);12)系统继续向下执行。
全文摘要
本发明提供的是一种提高软件系统安全性的软件热插拔方法。利用面向对象语言的多态性,提出中间接口表技术、类冗余文件包的概念。全局代理中间接口表由全局代理维护,表中的每个元素的键值为接口名,返回值为该接口类的对象。监视器存在于全局代理中,对软件主体和类冗余文件包中每一对对应的类文件进行监视。软件主体即软件编译后的结构目录。类冗余文件包这个包的目录结构与软件主体的目录结构完全相同,只是根目录不同。本发明的优点有能够加强系统的自我保护能力从而提高系统的安全性;提出中间接口表技术,维护一个结构相对简单的表并使软件的结构更加清晰与易于管理;只使用一个全局代理,降低了系统开销。
文档编号G06F21/00GK101369228SQ20081013732
公开日2009年2月18日 申请日期2008年10月14日 优先权日2008年10月14日
发明者周玉新, 王慧强, 王海峰, 董玺坤 申请人:哈尔滨工程大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1