XML文档可以根据不同的安全需求确定数据的加密粒度,借用这一特性,在实际应用中,根据访问者的访问权限,对同一XML文档加密不同的内容,实现根据用户的安全角色保密不同的数据信息,这需要对XML文档进行有效的、分角色的访问控制加密。下面,我们就以煤矿安全监控系统为例,根据用户对数据的访问角色,对监测数据信息进行动态加密,实现用户对非权限内数据透明,提出根据依据用户角色对XML数据实现加密的方法。
一、XML动态加密策略
XML文档的加解密通常采用“数字信封”的形式,可以使用不同的加密算法生成相应的密钥,根据加密密钥,对用户透明数据进行加密。工作过程如下:使用对称密钥对XML文档进行加密,再使用接收方的公钥加密对称密钥,接收方收到信息后,采用私钥解密对称密钥,再用该对称密钥解密XML文档。
1、加密规范
XML使用DOM树解析XML文档中的元素、属性、处理命令、内容和文本对不同敏感信息进行加密。加密后的数据仍是XML文档,W3C对XML加密的元素结构定义主要内容如下:
是XML加密文档的最基本的元素,用于标示加密的数据,包含的子元素有和其中:
1)表示采用的加密算法;
2)表示加密和解密数据的对称会话密钥,包含的子元素有在这些子元素中分别分别描述了建立、选择、交换对称密钥的方法。
3)表示加密后的信息,子元素有和o封装了加密后的数据,封装了对外部加密数据的引用。
4)表示加密数据和密钥的附加信息。
2、加密粒度
XML可以根据不同的用户访问权限确定不同的安全加密粒度。可以对整个XML文档加密、可以选择XML文档中的元素及其内容进行加密、可以对XML元素的内容进行加密、也可以对RTF、PDF等常用格式的的数据加密。
当对整个文档加密时,元素成为整个新的加密文档的根元素。当对文档中的元素或元素的内容加密时,< EncryptedData>代替加密元素。对元素加密时,的Type属性
可以设置为Type=http://www. w3. org/2001/04/xmlenc#Element,,#Element代表一个需要加密的元素。对元素内容加密时,Type属性可以设置为http://www.w3.org/2001/04/xmlenc#Contento其他类型的数据格式,采用IANA的类型定义。
3、加密控制策略
基于角色的XML文档加密,实际上是在XML文档加密粒度和XML文档对象之间进行显示的加密授权,然后通过加密策略集和实例对象之间的映射关系,找到符合该XML文档加密的模式实例,实现根据用户角色对XML文档进行动态信息加密。
(1)加密控制策略的角色加密关系
加密控制策略集是一个偏序关系,即自反、反对称和传递的。在这里,设偏序关系为≥,加密角色r1,r2。若r1拥有对某一对象的的加密策略,当r1≥r2时,表示r1所有的加密控制策略也是r2的策略。
(2)加密策略控制集
加密策略控制集是用户对XML文档加密策略的一个加密规则集合,由于XML结构的灵活性和可扩展性,可以采用XML格式定义加密控制策略集,实现根据用户角色对数据的访问权限,动态对XML文档数据加密。可以将加密策略集合定义成一个如下形式的七元组 EncrypteRules={Userld,Encrypteld,File,EncryptPath,EncryptTag,ValueType,Value},其中Userld表示用户的编号o Encrypteld表示该用户加密的编号,即该用户可以看到的明文数据的权限编号。File表示该用户操作的XML文件名o EncryptPath表示加密路径,使用XPath的形式定义,它指定XML文档用户对数据的加密路径。EncryptTag表示加密对象是子元素或属性名,从而实现对XML文档不同的粒度的加密口ralueType指明EncryptTag的名称是元素还是属性。Value表示ValueType的值。
二、动态加密算法设计
根据上述XML文档的加密规范和动态加密策略的设计,在实际应用中根据用户对XML数据的访问权限,实现对同一个XML文档,按照不同用户角色对该文档的访问权限实现动态加密。
1、系统需求
煤矿安全生产是矿山发展的一个重要的指标之一,在煤矿安全综合监控系统中,有关煤矿安全的瓦斯、通风、水文等数据是煤矿安全的重要指标。煤矿各个监测系统采集的数据可以集中上传到矿务局的中心服务器上的安全综合监控系统中,包括监测点编号、位置、监测数据名称、监测量、监测量上下限、报警值、监测时间、数据上传时间等。
当各个监测点数据上传到综合监控系统中,系统管理员、系统数据分析人员、总工及相关人员可以对数据进行访问,系统为不同的用户提供了相应的数据访问权限,为了简化工作量,可以对各个监测子系统上传的数据按照不同用户角色,对他们透明的数据进行加密,即用户只能看到自己权限内的明文数据,对于非权限内的数据,以密文的形式展现,这样可以不用重构传输数据的XML文档,直接对XML文档数据进行相应访问权限的加密,以明文数据和密文数据混合的XML数据文档形式,传输到相应的应用终端,实现不同用户对数据的动态访问。
2、体系结构
根据用户对XML文档访问粒度的不同,对原XML数据文档实现动态加密,完成对机密数据的保护,上面介绍了动态加密策略和加密算法,加密模块的体系结构如图l所示。
图1描述的是用户向认证服务器提出对XML文档数据的请求,经过认证后,系统将XML数据请求和用户信息发送给数据访问模块,数据访问模块将用户的数据请求传递给XML加密模块,加密模块根据用户对数据的请求查询加密策略集,得到用户的角色及相应的加密策略并将结果返回给加密模块,加密模块根据用户的角色,对请求的XML数据按照该用户的角色,加密透明数据,并将结果依次返回给用户。
3、动态加密算法
根据上述系统要求,煤矿监控系统中用户对数据访问的动态加密算法采用Java平台实现,使用j2sdk1.6.0_21开发环境,它集成了JCE(Java密码扩展)o JCE包中提供用于加密、密钥生成和协商以及消息认证码(MAC)算法的框架和实现。根据不同用户对XML文档的访问粒度,在不重构XML文档的情况下,在原数据文档的基础上,对用户透明的数据实现加密,从而实现对XML文档的动态加密。下面给出动态加密算法。
输入:input={Userld,object.xml,EncrypteRules.xml}
输出:output={Encrypte.xml}
1)获取用户权限,访问加密策略控制集EncrypteRule8,在EncrypteRules.xml文档中查询用户的角色,即对目标文档object.xml的加密粒度。
EncrypteGrain= getEncrypteRules( Userld,EncrypteRules. xml)
2)根据①中获得的用户加密粒度策略,对目标文档object.xml进行加密。
①定义解析器解析明文XML文档;
DocumentBuilder db= DocumentBuilderFactory. new Instance( ). newDocumentBuilder( )
②读取明文XML文档,用字符串变量表示数据;
FilelnputStream fis = new FilelnputStream( "object. xml" ) ;
Byte[ ] sourceFile = newfis. read( sourceFile)byte[ f18. available( ) ] ;
fis. read( sourceFile);
String s
③解析读取的XML文件,在(1)中获取的结果为要加密的元素即整个文件、某一个元素或属性。
④用AES 256k的密钥加密算法产生加密密钥encrypteKey,算法属性为 “http://www.w3. org/2001/04/xmlenc#aes256 - cbc”
⑤根据1)中的结果创建< EncryptedData>,并添加加密节点的命名空间属性。
//分别将加密粒度常量放在ELEMENT、CONTENT和DOCUMENT常量中,判断1)中的EncrypteGrain结果是否为上述3个常量的其中之一,将结果传递给encrypteType变量。
int DOCUMENT =1;
int ELEMENT =2;
int CONTENT =3;
switch(encrypteTypeld)l
casel:encrypteType:¨http://www.181.edu/in—notes/iana/assignments/media - types/text/xml;break;
case2:encrypteType=’lhttp://www.w3.org/2001/04/xmlenc#Element".break;
case 3:encrypteType=¨http://www. w3. org/2001/04/xmlenc#Content”;break;}
//创建< EncryptedData>,并设置加密数据的命名空间。
Element eData=doc, createElement(“EncryptedData");
eData. seLAttribute(“xmlns".encrypteType);
//创建< EncryptedData>的子节点,指定算法类型,
Element eMethod=doc. createElement(“EncryptionMeffiod");
eMethod.setAttribute(“Algorithm",http;//www. w3. org/2001/04/xmlenc#aes256 - cbc);
doc. appendChild( eMethod);
//产生加密数据,对加密数据使用Base64的编码形式,主要实现如下:
Cipher cipherobj=Cipher. getlnstance()
cipherObj.init(Cipher. ENCRYPT_MODE,
encKey)//用加密模式初始化加密对象
Byte[]cipherData=cipherObj. doFinal
(SourceString. getByte());//加密明文数据。
3)用< EncryptedData>代替明文中的加密节点,即不同用户所见的透明数据,以XML文档对象形式返回加密的XML文档。
XML文档coalminedata. xml清单如图2所示。
用户A具有角色R1,他拥有对矿井101数据的访问权限,用户B具有角色R2,他拥有对各个矿井一氧化碳的监测权,他们分别对example. xml进行访问,根据他们的角色(权限集)及加密控制策略集,得到XML文档的数据请求结果如图3所示。
小知识之XML
可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。