如何加密移動(dòng)電子拍賣系統(tǒng)

電子拍賣是傳統(tǒng)拍賣形式在線實(shí)現(xiàn)。賣方可以借助網(wǎng)上拍賣平臺(tái)運(yùn)用多媒體技術(shù)來(lái)展示自己的商品,這樣就可以免除傳統(tǒng)拍賣中實(shí)物的移動(dòng);競(jìng)拍方也可以借助網(wǎng)絡(luò),足不出戶進(jìn)行網(wǎng)上競(jìng)拍。該方式的驅(qū)動(dòng)者是傳統(tǒng)的拍賣中間商和平臺(tái)服務(wù)提供商(PSP)。

一、移動(dòng)電子拍賣系統(tǒng)簡(jiǎn)介及其安全性需求分析

下面將針對(duì)我們開發(fā)的基于J2ME的移動(dòng)拍賣系統(tǒng)——“拍趣”拍賣系統(tǒng)(該系統(tǒng)已經(jīng)成功的移植到手機(jī)中)具體地分析一個(gè)無(wú)線Web服務(wù)平臺(tái)的安全技術(shù)實(shí)現(xiàn)的案例。

1、移動(dòng)電子拍賣系統(tǒng)簡(jiǎn)介

移動(dòng)電子拍賣系統(tǒng)前臺(tái)采用J2ME平臺(tái)實(shí)現(xiàn)應(yīng)用,后臺(tái)采用Web服務(wù)技術(shù)實(shí)現(xiàn)服務(wù)提供者。

移動(dòng)電子拍賣系統(tǒng)由以下幾個(gè)部分組成:

1)系統(tǒng)初始化:后臺(tái)Web服務(wù)啟動(dòng),并公布有關(guān)拍賣品的信息;

2)用戶注冊(cè):每個(gè)競(jìng)拍者發(fā)送其必要信息到服務(wù)器端進(jìn)行注冊(cè);

3)用戶身份:用戶在系統(tǒng)中可以擁有雙重身份,既可以作為賣家,也可以作為買家;

4)用戶獲取拍賣信息:拍賣管理程序提供等待拍賣的商品信息,系統(tǒng)用戶可以登錄后瀏覽這些信息;

5)拍賣結(jié)束:拍賣成功,買家得到賣家的聯(lián)系方式,系統(tǒng)通知賣家競(jìng)拍過(guò)程結(jié)束;

6)拍賣失?。和ㄖu家,竟拍結(jié)束。

2、移動(dòng)電子拍賣系統(tǒng)安全性需求分析

在電子拍賣過(guò)程中要保證競(jìng)拍者注冊(cè)信息的保密性及保護(hù)競(jìng)拍者的出價(jià)信息,任何人都無(wú)法獲得竟拍者的身份及其投標(biāo)信息。

移動(dòng)電子拍賣系統(tǒng)應(yīng)有的安全特性如下:

競(jìng)拍者的信息保密性:系統(tǒng)提供對(duì)注冊(cè)用戶的信息以及出價(jià)信息的安全傳輸,防止被第三方截獲。

競(jìng)價(jià)信息的數(shù)據(jù)完整性:用戶在出價(jià)的時(shí)候,客戶端應(yīng)用實(shí)現(xiàn)對(duì)用戶出價(jià)信息的簽名操作,服務(wù)器端可以通過(guò)驗(yàn)證簽名信息保證數(shù)據(jù)的完整性。

競(jìng)拍服務(wù)的真實(shí)性:系統(tǒng)為客戶端提供了驗(yàn)證簽名的應(yīng)用,對(duì)服務(wù)器端的數(shù)據(jù)進(jìn)行驗(yàn)證,保證接受的服務(wù)的真實(shí)性。

不可欺騙性:任何人都不能偽裝某個(gè)已注冊(cè)的競(jìng)拍者進(jìn)行競(jìng)價(jià)。

二、移動(dòng)電子拍賣系統(tǒng)安全架構(gòu)

移動(dòng)電子拍賣系統(tǒng)采用單向認(rèn)證方案,系統(tǒng)的安全架構(gòu)如圖1所示。

系統(tǒng)包括使用對(duì)稱算法實(shí)現(xiàn)加密和非對(duì)稱算法簽名兩個(gè)階段過(guò)程。

系統(tǒng)在服務(wù)器端將產(chǎn)生一個(gè)共享密鑰,用于使用TripleDES對(duì)稱加密算法來(lái)加密/解密數(shù)據(jù)。對(duì)稱算法非常有效,并且可以與用于加密和解密計(jì)算的單一密鑰一起使用。Web服務(wù)安全性(WS-Security)實(shí)現(xiàn)使用一個(gè)隨機(jī)生成的密鑰。一旦消息的數(shù)據(jù)被加密,密鑰本身就被插人到消息中。

系統(tǒng)在客戶端應(yīng)用中保存了系統(tǒng)用于加密/解密SOAPL21消息的共享密鑰。在對(duì)SOAP消息操作的時(shí)候使用。對(duì)于消息的簽名使用的是一對(duì)非對(duì)稱密鑰——個(gè)私有的和一個(gè)公共的。這里使用X.509證書格式的密鑰,證書中包含有兩個(gè)密鑰,一個(gè)是證書的所有者私有的,而另一個(gè)是與他們一起開展業(yè)務(wù)的其他人共享的。

客戶端應(yīng)用對(duì)SOAP消息利用私有密鑰進(jìn)行數(shù)字簽名。這里對(duì)SOAP消息體進(jìn)行簽名。經(jīng)過(guò)客戶端應(yīng)用處理的簽名消息,包括關(guān)于簽名的密鑰信息就作為二進(jìn)制安全性令牌包含進(jìn)SOAP頭了。

當(dāng)服務(wù)提供者接收到Web服務(wù)請(qǐng)求時(shí),基于請(qǐng)求者的URL,請(qǐng)求就定向到SOAP處理引擎(SOAP運(yùn)行時(shí))。在請(qǐng)求中傳送的消息數(shù)據(jù)是經(jīng)過(guò)簽名和加密的,所以第一步就是識(shí)別SOAP頭中引用的X.509證書,并從X.509證書鏈的keystore(相當(dāng)一個(gè)數(shù)據(jù)庫(kù))中檢索它的私鑰。一旦獲得公鑰,就可以使用非對(duì)稱算法來(lái)驗(yàn)證簽名。通過(guò)共享密鑰對(duì)稱算法來(lái)解密消息數(shù)據(jù)。

三、移動(dòng)電子拍賣系統(tǒng)密鑰的產(chǎn)生、存儲(chǔ)和更新

服務(wù)器端產(chǎn)生密鑰后存放在應(yīng)用中,這里假設(shè)服務(wù)器端是可信的。服務(wù)器端僅提供了對(duì)來(lái)自客戶端的數(shù)據(jù)的完整性驗(yàn)證。

首先在服務(wù)器端產(chǎn)生密鑰,提取密鑰參數(shù),保留參數(shù)值,在發(fā)布客戶端應(yīng)用的時(shí)候,提取密鑰參數(shù)值,重新構(gòu)建密鑰,針對(duì)所有的客戶端,都使用同一對(duì)密鑰。這一對(duì)密鑰在服務(wù)器端的密鑰庫(kù)中有同樣的備份,服務(wù)器端收到來(lái)自客戶端的簽名SOAP消息后,利用公鑰驗(yàn)證消息的完整性。

提供加密的共享密鑰也以密文的形式存儲(chǔ)在客戶端應(yīng)用中,在對(duì)原始消息加密時(shí)使用。

現(xiàn)在需要導(dǎo)出密鑰參數(shù)。系統(tǒng)首先在服務(wù)器端應(yīng)用中產(chǎn)生用于簽名的密鑰對(duì)和用于加密的共享密鑰對(duì)后,需要提取出密鑰參數(shù),利用這些參數(shù),在客戶端能夠重新構(gòu)建密鑰對(duì)。獲取密鑰對(duì)中私鑰的一個(gè)參數(shù)的方法如下:

privKey 2(RSAPrjyateCrtKeyPararnere)

keyPair. getPrivate();

//導(dǎo)出私鑰參數(shù)

BiglnteSer privateKeyDP 2 privKey. SetDP();

//在控制臺(tái)輸出密鑰參數(shù)

System. out. prindn(”privateKeyDP=“+pmrateKeyDP);

//將控制臺(tái)輸出的密鑰參數(shù)重新賦值構(gòu)造新的密鑰

prjyateKeyDP=new Bigjnteger

”2979750878679664390023599054709331027032702302444708816092225306357352950956680073014685040182357508935392476975479182826100362278654349880244458787077073’);

私鑰共有八個(gè)參數(shù),需要一一導(dǎo)出并存儲(chǔ),保留在程序中,在客戶端重新構(gòu)建密鑰。

如果密鑰被長(zhǎng)時(shí)間存儲(chǔ)在服務(wù)器端而得不到更新,勢(shì)必會(huì)造成密鑰泄密。因此為了防止這種危險(xiǎn)情況的出現(xiàn),密鑰應(yīng)該定時(shí)更換。其中有一個(gè)需要注意的問(wèn)題就是密鑰的更換時(shí)間,無(wú)論是簽發(fā)者或是被簽者的密鑰作廢時(shí)間,要與每個(gè)證書的有效截止日期保持一致。

此系統(tǒng)采用了如下的技術(shù)解決密鑰更新的問(wèn)題,即PKI(Public Key Infrastructure)實(shí)體在密鑰截止之前,就取得新密鑰對(duì)和新證書,在截止日期到達(dá)后,PKI中的實(shí)體便開始使用新的私鑰進(jìn)行對(duì)數(shù)據(jù)的簽名,同時(shí)將舊密鑰對(duì)和證書歸檔保存。

四、移動(dòng)電子拍賣系統(tǒng)服務(wù)器端安全實(shí)現(xiàn)

1、安全服務(wù)內(nèi)容

(1)用戶注冊(cè)服務(wù)

加密傳輸:客戶端提交注冊(cè)信息后,消息處理器從原始消息中提取出消息體,針對(duì)消息體進(jìn)行加密,加密的SOAP消息重新封裝成一個(gè)完整的加密消息發(fā)送。

解密數(shù)據(jù):在服務(wù)器端對(duì)用戶注冊(cè)信息進(jìn)行解密后提交給下一層邏輯。

簽名注冊(cè)信息:對(duì)用戶注冊(cè)信息進(jìn)行簽名,到服務(wù)器端驗(yàn)證數(shù)據(jù)的完整性。

用戶注冊(cè)服務(wù)的過(guò)程如圖2所示。

(2)競(jìng)拍服務(wù)

簽名出價(jià)數(shù)據(jù):對(duì)用戶提供的出價(jià)數(shù)據(jù),使用客戶端的私鑰進(jìn)行簽名后發(fā)送,數(shù)據(jù)發(fā)送到服務(wù)器端后驗(yàn)證客戶端消息的完整性。

加密/解密出價(jià)數(shù)據(jù):客戶端對(duì)出價(jià)數(shù)據(jù)加密,服務(wù)器端解密出價(jià)數(shù)據(jù)。

競(jìng)拍服務(wù)的過(guò)程如圖3所示。

2、自簽名證書密鑰模型

在服務(wù)器端,系統(tǒng)采用X.509格式的證書的方式米存儲(chǔ)密鑰,在JDKl.4中,提供了一個(gè)命令行的工具Keytool。它是安全鑰匙與證書的管理工具,管理一個(gè)存儲(chǔ)了私有鑰匙和驗(yàn)證相應(yīng)公共鑰匙以及與它們相關(guān)聯(lián)的keystore。Keytool把鑰匙和證書儲(chǔ)存到一個(gè)keystore中。默任的實(shí)現(xiàn)keystore的是一個(gè)文件。它用一個(gè)密碼保護(hù)鑰匙。

Keystore有兩個(gè)不同的入口:

1)鑰匙入口:保存了非常敏感的加密的鑰匙信息,并且是用一個(gè)保護(hù)的格式存儲(chǔ)以防止未被授權(quán)的訪問(wèn)。以這種形式存儲(chǔ)的鑰匙是秘密鑰匙,或是一個(gè)對(duì)應(yīng)證書鏈中公有鑰匙的私有鑰匙。

2)信任證書入口:包含一個(gè)屬于其他部分的單一公共鑰匙證書。它之所以被稱為“信任證書”,是因?yàn)閗eystore信任的證書中的公共鑰匙真正屬于證書所有音的身份識(shí)別。

使用JDKl.4自帶的工具KeyTooI可以生成一個(gè)自簽名的符合X.509格式的證書。

生成證書的方法如下:

->kcytool - genkey - alias test - keyalg RSA - keystorc

servertcert.jks(指定keystore文件名)輸入keystore密碼:

kcystoretcst

您的名字與姓氏是什么?

[Unknown]:Mnbilc Auction

您的組織單位名稱是什么?

[Cnknown]: College of Computer

您的組織名稱是什么?

[Unknown]:Sichun University

您所在的城市或區(qū)域名稱是什么?

[Unknown]: Chengdu

您所在的州或省份名稱是什么?

[unknown]:Sichuan
該單位的兩字母國(guó)家代碼是什么?

[unknown]: CN

CN=Mobile Auction, OL,r= College of Computcr,

0= Sichuan Univcrsity.L=Chengdu, ST= Sichuan,

C=CN正確嗎?

[否]:y

輸入的主密碼

輸入的主密碼

如果和lceystort密碼相同

按回車

3、驗(yàn)證服務(wù)實(shí)現(xiàn)

在競(jìng)拍服務(wù)中,系統(tǒng)提供了對(duì)來(lái)自客戶端的已簽名的出價(jià)數(shù)據(jù)的驗(yàn)證,以保證數(shù)據(jù)的完整性。用戶同時(shí)提供用戶名和密碼,系統(tǒng)驗(yàn)證用戶的身份,證明用戶出價(jià)數(shù)據(jù)的不可否認(rèn)性。

服務(wù)器端進(jìn)行驗(yàn)證簽名服務(wù)的部署方法如下(在其部署描述符文件Bid. xml中加入下面顯示為斜體的代碼):

(class> cn. cdu. cdutscu. ws. Hid

ycs

< - -驗(yàn)證來(lái)自客戶的針對(duì)消息體進(jìn)行簽名的消息—一>

< -ssSignature>

soap: Envelope/soup: llody(/referencc>

senTrccrt.jks< /lrusIStorc>

kcysroretest

4、基于Glue的Triple DES解密服務(wù)實(shí)現(xiàn)

在系統(tǒng)中已經(jīng)開發(fā)的用戶注冊(cè)服務(wù)User中,需要實(shí)現(xiàn)對(duì)來(lái)自客戶端的用戶注冊(cè)信息的解密功能。系統(tǒng)使用的Web服務(wù)器是Glue5. 01.Clue5. 01企業(yè)版已經(jīng)實(shí)現(xiàn)了WS -Security1.O規(guī)范,支持XML的簽名和加密,它內(nèi)置的安全包提供了實(shí)現(xiàn)方案。在服務(wù)器端對(duì)User服務(wù)進(jìn)行安全配置的方法如下:

首先需要為加密/解密應(yīng)用產(chǎn)生一個(gè)共享密鑰,在應(yīng)用中可以通過(guò)實(shí)現(xiàn)產(chǎn)生共享密鑰,這里系統(tǒng)使用Glue提供的一個(gè)可以產(chǎn)生基于Triple DES算法的對(duì)稱密鑰的工具來(lái)產(chǎn)生一個(gè)隨機(jī)的用于加密/解密的對(duì)稱密鑰:

->java TnpleDESKcy

kn89 \\r7 byFYz4 EOXWsOUxnpj/PVu28hWM

客戶端利用此密鑰加密SOAP消息,服務(wù)器端利用它解密SOAP消息。

針對(duì)用戶注冊(cè)服務(wù),在其配置描述符文件User. xml中配置解密服務(wù)的方法如下:

< service >

< constrvctor >

< class > cn. edu. cdutscu. ws. User

< publish> yes

< ! - -來(lái)自客戶端請(qǐng)求的SOAP Body的內(nèi)容是使用此密鑰加密的一一>

< wr-sEncryption>

< reference> soap: Envclope/soap: Body/.

< sccretKey>

< rralm> acl

在標(biāo)簽< realm>中表明用戶所處的域口在Glue5. 01中,使用了域的概念來(lái)實(shí)現(xiàn)對(duì)基于用戶名/密碼信息/角色信息的管理控制,在Glue中定義了基本域(BasicRealm)、Acl域( AcIRealm)和JAAS域三種域,分別定義了不同級(jí)別的用戶/角色類型,來(lái)控制客戶端用戶對(duì)資源的訪問(wèn),這里采用了Acl域模式來(lái)實(shí)現(xiàn)訪問(wèn)控制。系統(tǒng)啟動(dòng)的時(shí)候會(huì)初始化域信息,域信息保存在一個(gè)特定的文件中,Ad域的成員信息保存在acl. xml文件中,這個(gè)文件保存在\youwebapp/WEB - lNF/security/目錄下面。

這里Glue使用訪問(wèn)控制結(jié)合共享密鑰加密的機(jī)制來(lái)實(shí)現(xiàn)加密解密方案。在客戶端必須是一個(gè)存在于Acl域的成員來(lái)訪問(wèn)服務(wù)器端的資源,在域成員中定義了共享密鑰的值。< reference>標(biāo)簽中的內(nèi)容控制對(duì)消息體進(jìn)行加密,標(biāo)明為soap:Envclope/soap; Body/。則表示對(duì)SOAP Body進(jìn)行解密,來(lái)自客戶端的加密請(qǐng)求通過(guò)消息處理器解析后,在服務(wù)器端利用Triple DES算法生成的對(duì)稱密鑰對(duì)密文進(jìn)行解密操作。

五、移動(dòng)電子拍賣系統(tǒng)客戶端安全實(shí)現(xiàn)

1、實(shí)現(xiàn)方案

要在無(wú)線設(shè)備上面實(shí)現(xiàn)簽名和加密方案,在技術(shù)實(shí)現(xiàn)上將會(huì)遇到很多困難,和傳統(tǒng)的有線網(wǎng)絡(luò)上的方案相比有很大的不同。在本系統(tǒng)客戶端要實(shí)現(xiàn)加密和簽名應(yīng)用,需要綜合考慮下面幾個(gè)因素:密鑰的存儲(chǔ)。SOAP消息的提取和解析,SOAP消息的封裝和發(fā)送,算法的選擇。

2、J2ME客戶端和Web服務(wù)交互

系統(tǒng)采用KSOAP的支持來(lái)處理底層的SOAP消息,在J2ME CVeb Service規(guī)范出現(xiàn)之前。要在J2ME客戶端使用Web服務(wù),一般通過(guò)兩種方式:一是用Servlet作代理,二是用KSOAP在MIDlet中直接訪問(wèn)Web服務(wù)。本系統(tǒng)應(yīng)用KSOAP對(duì)SOAP消息進(jìn)行解析和封裝。在無(wú)線設(shè)備上利用KSOAP調(diào)用Web服務(wù)的方法如下:

//創(chuàng)建—個(gè)新的SOAP請(qǐng)求消息

So.pObjcct mcthod=ncw SoapObject

(“you rNamespace“,¨newUser¨);

//添加方法的參數(shù)

mcthod.addProperty(”newUserParam。

userName: pas.word: 12345;

//創(chuàng)建一個(gè)連接對(duì)象

transport. HttpTranspart transport=

new kswp.trinsport.HttpTransport(”http: //localhost: 8004/glue/services/User”,”);

//調(diào)用的到返回結(jié)果

Object result=tnrnsport,Call( transport,method);

3、加密引擎的實(shí)現(xiàn)

客戶端對(duì)未發(fā)送的SOAP消息進(jìn)行加密,重新構(gòu)造一個(gè)加密的SOAP消息。首先從SOAP請(qǐng)求中得到將要發(fā)送的請(qǐng)求SOAP消息,獲取SOAP消息的方法如下:

//創(chuàng)建一個(gè)SOAP消息對(duì)象

SoapObject method=new SoapObject

(”yourN arnespace”,“newUser");

method. addProperty(”newUserPamm”,”hhh: hhh: 12345”);

//利用砸寫的HrtpTransport類建立連接

ksoMp. tnnspart.HttpTransport tnnspmt=new ksoap. tnnspon. HttpTmmpot

H http: //star: 8004/glue/services/User;

系統(tǒng)提供了KsoapUtils類,在其中提供了一個(gè)8ecureCall方法,利用這個(gè)方法替代正常的Call調(diào)用,使得發(fā)送的SOAP消息在服務(wù)器端能夠被驗(yàn)證和解密。

在應(yīng)用通過(guò)HttpTransport連接調(diào)用遠(yuǎn)程服務(wù)之前,需要產(chǎn)生SOAP請(qǐng)求消息并加密SOAP Body。

4、簽名引擎的實(shí)現(xiàn)

對(duì)原始SOAP消息實(shí)現(xiàn)簽名,首先要處理SOAP消息的摘要。產(chǎn)生消息摘要的方法如下,這里使用的產(chǎn)生消息摘要的算法是SHA1算法。

用于簽名的私鑰在應(yīng)用中已經(jīng)被重新構(gòu)建,所以可以直接使用其對(duì)消息簽名。簽名的方法如下:

tatic public Strin8 SetSignturc(SmnS bodyXml)

SHAIDigest diSe8tFric=new SHAIDige.t();

RSASiBUtil ru=new RSASiSUtil();

digeatFac=(SHAIDige8t)ru.getDigest( bodyXml);

RSAEnOne rsaFnc=ncw RSAEnginc();

PSSSigncr 8igner - ncw PSSSigner

(rsrLFaC.dige8th,c.64);

iigner. init( tnje, privKey):

byte[]8igned=8igner. genenueSigiature);

Smrigre8ult=ncw Stnn8( Bue64.cncode(8igned));

rltrirri TC8Ult;

}

小知識(shí)之SOAP簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議是交換數(shù)據(jù)的一種協(xié)議規(guī)范,是一種輕量的、簡(jiǎn)單的、基于XML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)子集)的協(xié)議,它被設(shè)計(jì)成在WEB上交換結(jié)構(gòu)化的和固化的信息。