使用XML实现网络间数据的加密交换
摘要:
随着人们对知识产权认识的不断提高,越来越受到人们正在通过不同的途径,来维护自身的利益。文中探讨了如何使用XML技术阻止未被授权者使用软件的一种方法,并通过一个发行诗集的实例,具体阐述其实现过程。
关键词:软件保护,XML ,DOM
随着计算机网络的不断普及和发展,网上资源也在不断的丰富和发展。使用网络资源的人们也越来越多,工作效率也得以不断的提高。但这同时也带来一些负面影响,主要问题就是软件产品(如一幅图片或一篇文章)作者的权利不能得到有利的保护,人们通过点击浏览或下载文件到本地机上就可以使用了,而不必征求作者的意见,使得盗版得以泛滥。
要解决这个问题,目前通用的办法就是使用服务器进行用户身份验证,然后进入用户区域进行访问。但一旦软件资源被放到服务器之外,谁都可以使用这个。基于这个问题,笔者提出一种新的解决方案,就是从软件本身入手解决盗版问题------为每一个作品添加一把由作者指定的密钥,不论谁使用必须有密匙方能打开。
基本思想就是在要发布的软件中加入一些信息,当用户打开时由这些信息进行必要的验证,这些信息基本上可以分为两类,一类是通过网络进行身份验证,也就是说,每当用户打开文件时,软件中的这些信息会自动的通过网络向某一服务器提出身份验证请求,如果成功则允许文件打开,否则失败。当然,如果没有网络连接,就永远不能打开。另一类则是通过软件本身附带的信息进行验证,只要输入信息正确,就能打开。本文主要就使用这种方法进行软件保护加以论证。
其流程如下:
在这个流程中应考虑到的问题:
? 考虑到不同职业的作者都能使用,软件加密的不应复杂
? 与平台无关性,即在任何平台(WINDOWS,UNIX或其它操作系统)都可使用
考虑到上述要求,应选择适当的既能为大众接受,也能在不同平台运行的语言,能满足这一要求的,目前来讲就是XML(eXtensible Markup Language)。因此下面具体方案中,讨论如何使用XML来进行软件加密处理。
一、 文档结构:
首先,在定义文档结构时应考虑附加传送的信息,可以加入作者的信息或密码,供阅读时使用或检验,这里一首诗为例加以阐述。其结构如下:
<!DOCTYPE 中华诗词 [
<!ELEMENT 中华诗词 (诗词+) >
<!ELEMENT 诗词 (名称,序号,作者+,年代?,内容)>
<!ELEMENT 名称 (#PCDATA)>
<!ATTLIST 名称 密码 CDATA #REQUIRED>
<!ELEMENT 序号 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 年代 (#PCDATA)>
<!ELEMENT 内容 (row+)>
<!ELEMENT row (#PCDATA)>
]>
除了诗词的必要信息外,在“名称”标记内,添加了“密码”属性,并要求每一首诗都要添加密码,以便阅读时验证。
二、文档阅读:
用户客户界面使用IE浏览器完成。笔者使用Jscript和IE中的DOM(Document Object Model)加以实现。其过程如下:
1>创建DOM对象实例,并载入XML数据
source = new ActiveXObject('Microsoft.XMLDOM');
source.async = false;
source.load('poem.xml');
root = source.documentElement;
if (source.parseError.errorCode != 0)
{
…显示错误信息
}
2> 根据用户要求,响应事件
设计中为了使用方便,加入了两个SELECT 元件,
一个是用来选择作者,另外的是用来选择该作者的作品。当系统运行之后,自动列出所有的作者,
var len=root.selectSingleNode("//中华诗词").childNodes.length; //取得子节点数目
var node=root.selectSingleNode("//中华诗词").firstChild; //取得诗词子节点
var selops=document.showform.author.options;
for(i=0; i!=len;i++){
x=node.selectSingleNode("作者").text;
if(a.indexOf(x)==-1){ a+=x; selops.add(new Option(x)); }
selops.selectedIndex=0; node=node.nextSibling;
}
在用户选择了某个作者之后,系统会根据用户选择的作者,查找该作者的作品
for(i=0; i!=len;i++){
x=node.selectSingleNode("作者").text;
if(x==au){
x=node.selectSingleNode("名称").text; y=node.selectSingleNode("序号").text; //查找作品
OOp=new Option(x); OOp.text=x;
OOp.value=y; selops.add(OOp); } //Oop的value记录作品的序号,供下面比较
node=node.nextSibling;
}
在用户选择了作品之后,系统会提示用户输入密码,再根据密码进行选择id=obj.options[obj.selectedIndex].value; // 用户选择的序号
在XML中查找序号
x=node.selectSingleNode("序号").text;
if(x==id){
y=prompt("输入密码",""); // 密码验证
If(x!=y){alert("权限受限/n请与"+node.selectSingleNode("作者/@邮箱").text+"/n联系 ");
return false; // 输入错误,返回 } }
cmStr=node.selectSingleNode("名称").text;
cmStr+="/n/n"+node.selectSingleNode("作者").text;
cmStr+="/n/n"+node.selectSingleNode("年代").text+"/n";
var l=node.selectSingleNode("内容").childNodes.length;
childNode=node.selectSingleNode("内容").firstChild;
for (j=0;j!=l;j++){ //显示内容
cmStr+="/n"+childNode.te