XML動(dòng)態(tài)加密方法

XML文檔可以根據(jù)不同的安全需求確定數(shù)據(jù)的加密粒度,借用這一特性,在實(shí)際應(yīng)用中,根據(jù)訪問者的訪問權(quán)限,對(duì)同一XML文檔加密不同的內(nèi)容,實(shí)現(xiàn)根據(jù)用戶的安全角色保密不同的數(shù)據(jù)信息,這需要對(duì)XML文檔進(jìn)行有效的、分角色的訪問控制加密。下面,我們就以煤礦安全監(jiān)控系統(tǒng)為例,根據(jù)用戶對(duì)數(shù)據(jù)的訪問角色,對(duì)監(jiān)測(cè)數(shù)據(jù)信息進(jìn)行動(dòng)態(tài)加密,實(shí)現(xiàn)用戶對(duì)非權(quán)限內(nèi)數(shù)據(jù)透明,提出根據(jù)依據(jù)用戶角色對(duì)XML數(shù)據(jù)實(shí)現(xiàn)加密的方法。

一、XML動(dòng)態(tài)加密策略

XML文檔的加解密通常采用“數(shù)字信封”的形式,可以使用不同的加密算法生成相應(yīng)的密鑰,根據(jù)加密密鑰,對(duì)用戶透明數(shù)據(jù)進(jìn)行加密。工作過(guò)程如下:使用對(duì)稱密鑰對(duì)XML文檔進(jìn)行加密,再使用接收方的公鑰加密對(duì)稱密鑰,接收方收到信息后,采用私鑰解密對(duì)稱密鑰,再用該對(duì)稱密鑰解密XML文檔。

1、加密規(guī)范

XML使用DOM樹解析XML文檔中的元素、屬性、處理命令、內(nèi)容和文本對(duì)不同敏感信息進(jìn)行加密。加密后的數(shù)據(jù)仍是XML文檔,W3C對(duì)XML加密的元素結(jié)構(gòu)定義主要內(nèi)容如下:

是XML加密文檔的最基本的元素,用于標(biāo)示加密的數(shù)據(jù),包含的子元素有和其中:

1)表示采用的加密算法;

2)表示加密和解密數(shù)據(jù)的對(duì)稱會(huì)話密鑰,包含的子元素有在這些子元素中分別分別描述了建立、選擇、交換對(duì)稱密鑰的方法。

3)表示加密后的信息,子元素有和o封裝了加密后的數(shù)據(jù),封裝了對(duì)外部加密數(shù)據(jù)的引用。

4)表示加密數(shù)據(jù)和密鑰的附加信息。

2、加密粒度

XML可以根據(jù)不同的用戶訪問權(quán)限確定不同的安全加密粒度。可以對(duì)整個(gè)XML文檔加密、可以選擇XML文檔中的元素及其內(nèi)容進(jìn)行加密、可以對(duì)XML元素的內(nèi)容進(jìn)行加密、也可以對(duì)RTF、PDF等常用格式的的數(shù)據(jù)加密。

當(dāng)對(duì)整個(gè)文檔加密時(shí),元素成為整個(gè)新的加密文檔的根元素。當(dāng)對(duì)文檔中的元素或元素的內(nèi)容加密時(shí),< EncryptedData>代替加密元素。對(duì)元素加密時(shí),的Type屬性
可以設(shè)置為Type=http://www. w3. org/2001/04/xmlenc#Element,,#Element代表一個(gè)需要加密的元素。對(duì)元素內(nèi)容加密時(shí),Type屬性可以設(shè)置為http://www.w3.org/2001/04/xmlenc#Contento其他類型的數(shù)據(jù)格式,采用IANA的類型定義。

3、加密控制策略

基于角色的XML文檔加密,實(shí)際上是在XML文檔加密粒度和XML文檔對(duì)象之間進(jìn)行顯示的加密授權(quán),然后通過(guò)加密策略集和實(shí)例對(duì)象之間的映射關(guān)系,找到符合該XML文檔加密的模式實(shí)例,實(shí)現(xiàn)根據(jù)用戶角色對(duì)XML文檔進(jìn)行動(dòng)態(tài)信息加密。

(1)加密控制策略的角色加密關(guān)系

加密控制策略集是一個(gè)偏序關(guān)系,即自反、反對(duì)稱和傳遞的。在這里,設(shè)偏序關(guān)系為≥,加密角色r1,r2。若r1擁有對(duì)某一對(duì)象的的加密策略,當(dāng)r1≥r2時(shí),表示r1所有的加密控制策略也是r2的策略。

(2)加密策略控制集

加密策略控制集是用戶對(duì)XML文檔加密策略的一個(gè)加密規(guī)則集合,由于XML結(jié)構(gòu)的靈活性和可擴(kuò)展性,可以采用XML格式定義加密控制策略集,實(shí)現(xiàn)根據(jù)用戶角色對(duì)數(shù)據(jù)的訪問權(quán)限,動(dòng)態(tài)對(duì)XML文檔數(shù)據(jù)加密??梢詫⒓用懿呗约隙x成一個(gè)如下形式的七元組 EncrypteRules={Userld,Encrypteld,File,EncryptPath,EncryptTag,ValueType,Value},其中Userld表示用戶的編號(hào)o Encrypteld表示該用戶加密的編號(hào),即該用戶可以看到的明文數(shù)據(jù)的權(quán)限編號(hào)。File表示該用戶操作的XML文件名o EncryptPath表示加密路徑,使用XPath的形式定義,它指定XML文檔用戶對(duì)數(shù)據(jù)的加密路徑。EncryptTag表示加密對(duì)象是子元素或?qū)傩悦?,從而?shí)現(xiàn)對(duì)XML文檔不同的粒度的加密口ralueType指明EncryptTag的名稱是元素還是屬性。Value表示ValueType的值。

二、動(dòng)態(tài)加密算法設(shè)計(jì)

根據(jù)上述XML文檔的加密規(guī)范和動(dòng)態(tài)加密策略的設(shè)計(jì),在實(shí)際應(yīng)用中根據(jù)用戶對(duì)XML數(shù)據(jù)的訪問權(quán)限,實(shí)現(xiàn)對(duì)同一個(gè)XML文檔,按照不同用戶角色對(duì)該文檔的訪問權(quán)限實(shí)現(xiàn)動(dòng)態(tài)加密。

1、系統(tǒng)需求

煤礦安全生產(chǎn)是礦山發(fā)展的一個(gè)重要的指標(biāo)之一,在煤礦安全綜合監(jiān)控系統(tǒng)中,有關(guān)煤礦安全的瓦斯、通風(fēng)、水文等數(shù)據(jù)是煤礦安全的重要指標(biāo)。煤礦各個(gè)監(jiān)測(cè)系統(tǒng)采集的數(shù)據(jù)可以集中上傳到礦務(wù)局的中心服務(wù)器上的安全綜合監(jiān)控系統(tǒng)中,包括監(jiān)測(cè)點(diǎn)編號(hào)、位置、監(jiān)測(cè)數(shù)據(jù)名稱、監(jiān)測(cè)量、監(jiān)測(cè)量上下限、報(bào)警值、監(jiān)測(cè)時(shí)間、數(shù)據(jù)上傳時(shí)間等。

當(dāng)各個(gè)監(jiān)測(cè)點(diǎn)數(shù)據(jù)上傳到綜合監(jiān)控系統(tǒng)中,系統(tǒng)管理員、系統(tǒng)數(shù)據(jù)分析人員、總工及相關(guān)人員可以對(duì)數(shù)據(jù)進(jìn)行訪問,系統(tǒng)為不同的用戶提供了相應(yīng)的數(shù)據(jù)訪問權(quán)限,為了簡(jiǎn)化工作量,可以對(duì)各個(gè)監(jiān)測(cè)子系統(tǒng)上傳的數(shù)據(jù)按照不同用戶角色,對(duì)他們透明的數(shù)據(jù)進(jìn)行加密,即用戶只能看到自己權(quán)限內(nèi)的明文數(shù)據(jù),對(duì)于非權(quán)限內(nèi)的數(shù)據(jù),以密文的形式展現(xiàn),這樣可以不用重構(gòu)傳輸數(shù)據(jù)的XML文檔,直接對(duì)XML文檔數(shù)據(jù)進(jìn)行相應(yīng)訪問權(quán)限的加密,以明文數(shù)據(jù)和密文數(shù)據(jù)混合的XML數(shù)據(jù)文檔形式,傳輸?shù)较鄳?yīng)的應(yīng)用終端,實(shí)現(xiàn)不同用戶對(duì)數(shù)據(jù)的動(dòng)態(tài)訪問。

2、體系結(jié)構(gòu)

根據(jù)用戶對(duì)XML文檔訪問粒度的不同,對(duì)原XML數(shù)據(jù)文檔實(shí)現(xiàn)動(dòng)態(tài)加密,完成對(duì)機(jī)密數(shù)據(jù)的保護(hù),上面介紹了動(dòng)態(tài)加密策略和加密算法,加密模塊的體系結(jié)構(gòu)如圖l所示。

XML動(dòng)態(tài)加密方法

圖1描述的是用戶向認(rèn)證服務(wù)器提出對(duì)XML文檔數(shù)據(jù)的請(qǐng)求,經(jīng)過(guò)認(rèn)證后,系統(tǒng)將XML數(shù)據(jù)請(qǐng)求和用戶信息發(fā)送給數(shù)據(jù)訪問模塊,數(shù)據(jù)訪問模塊將用戶的數(shù)據(jù)請(qǐng)求傳遞給XML加密模塊,加密模塊根據(jù)用戶對(duì)數(shù)據(jù)的請(qǐng)求查詢加密策略集,得到用戶的角色及相應(yīng)的加密策略并將結(jié)果返回給加密模塊,加密模塊根據(jù)用戶的角色,對(duì)請(qǐng)求的XML數(shù)據(jù)按照該用戶的角色,加密透明數(shù)據(jù),并將結(jié)果依次返回給用戶。

3、動(dòng)態(tài)加密算法

根據(jù)上述系統(tǒng)要求,煤礦監(jiān)控系統(tǒng)中用戶對(duì)數(shù)據(jù)訪問的動(dòng)態(tài)加密算法采用Java平臺(tái)實(shí)現(xiàn),使用j2sdk1.6.0_21開發(fā)環(huán)境,它集成了JCE(Java密碼擴(kuò)展)o JCE包中提供用于加密、密鑰生成和協(xié)商以及消息認(rèn)證碼(MAC)算法的框架和實(shí)現(xiàn)。根據(jù)不同用戶對(duì)XML文檔的訪問粒度,在不重構(gòu)XML文檔的情況下,在原數(shù)據(jù)文檔的基礎(chǔ)上,對(duì)用戶透明的數(shù)據(jù)實(shí)現(xiàn)加密,從而實(shí)現(xiàn)對(duì)XML文檔的動(dòng)態(tài)加密。下面給出動(dòng)態(tài)加密算法。

輸入:input={Userld,object.xml,EncrypteRules.xml}

輸出:output={Encrypte.xml}

1)獲取用戶權(quán)限,訪問加密策略控制集EncrypteRule8,在EncrypteRules.xml文檔中查詢用戶的角色,即對(duì)目標(biāo)文檔object.xml的加密粒度。

EncrypteGrain= getEncrypteRules( Userld,EncrypteRules. xml)

2)根據(jù)①中獲得的用戶加密粒度策略,對(duì)目標(biāo)文檔object.xml進(jìn)行加密。

①定義解析器解析明文XML文檔;

DocumentBuilder db= DocumentBuilderFactory. new Instance( ). newDocumentBuilder( )

②讀取明文XML文檔,用字符串變量表示數(shù)據(jù);

FilelnputStream fis = new FilelnputStream( "object. xml" ) ;

Byte[ ] sourceFile = newfis. read( sourceFile)byte[ f18. available( ) ] ;

fis. read( sourceFile);

String s

③解析讀取的XML文件,在(1)中獲取的結(jié)果為要加密的元素即整個(gè)文件、某一個(gè)元素或?qū)傩浴?/p>

④用AES 256k的密鑰加密算法產(chǎn)生加密密鑰encrypteKey,算法屬性為 “http://www.w3. org/2001/04/xmlenc#aes256 - cbc”

⑤根據(jù)1)中的結(jié)果創(chuàng)建< EncryptedData>,并添加加密節(jié)點(diǎn)的命名空間屬性。

//分別將加密粒度常量放在ELEMENT、CONTENT和DOCUMENT常量中,判斷1)中的EncrypteGrain結(jié)果是否為上述3個(gè)常量的其中之一,將結(jié)果傳遞給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;}

//創(chuàng)建< EncryptedData>,并設(shè)置加密數(shù)據(jù)的命名空間。

Element eData=doc, createElement(“EncryptedData");

eData. seLAttribute(“xmlns".encrypteType);

//創(chuàng)建< EncryptedData>的子節(jié)點(diǎn),指定算法類型,

Element eMethod=doc. createElement(“EncryptionMeffiod");

eMethod.setAttribute(“Algorithm",http;//www. w3. org/2001/04/xmlenc#aes256 - cbc);

doc. appendChild( eMethod);

//產(chǎn)生加密數(shù)據(jù),對(duì)加密數(shù)據(jù)使用Base64的編碼形式,主要實(shí)現(xiàn)如下:

Cipher cipherobj=Cipher. getlnstance()

cipherObj.init(Cipher. ENCRYPT_MODE,

encKey)//用加密模式初始化加密對(duì)象

Byte[]cipherData=cipherObj. doFinal

(SourceString. getByte());//加密明文數(shù)據(jù)。

3)用< EncryptedData>代替明文中的加密節(jié)點(diǎn),即不同用戶所見的透明數(shù)據(jù),以XML文檔對(duì)象形式返回加密的XML文檔。

XML文檔coalminedata. xml清單如圖2所示。

1

用戶A具有角色R1,他擁有對(duì)礦井101數(shù)據(jù)的訪問權(quán)限,用戶B具有角色R2,他擁有對(duì)各個(gè)礦井一氧化碳的監(jiān)測(cè)權(quán),他們分別對(duì)example. xml進(jìn)行訪問,根據(jù)他們的角色(權(quán)限集)及加密控制策略集,得到XML文檔的數(shù)據(jù)請(qǐng)求結(jié)果如圖3所示。

1

小知識(shí)之XML

可擴(kuò)展標(biāo)記語(yǔ)言,標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集,是一種用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語(yǔ)言。