[摘要]XML數(shù)字簽名技術(shù)可以在無線Web服務(wù)應(yīng)用程序提供輕量級(jí)且靈活的安全解決方案。本文討論了XML數(shù)字簽名及其應(yīng)用程序的重要性,并提供了Bouncy Castle密碼包的數(shù)字簽名API,最后給出了在J2ME/MIDP無線客戶端和JSP頁(yè)后臺(tái)之間的安全XML消息傳遞環(huán)境中的實(shí)現(xiàn)示例。
[關(guān)鍵詞]J2ME XML 數(shù)字簽名
一、引言
基于Java的Web服務(wù)和無線Java開發(fā)是JavaOne的兩個(gè)最突出的主題。它們代表普及計(jì)算領(lǐng)域中未來的后端和前端Java技術(shù)。
Java 平臺(tái)可以在無線 Web 服務(wù)應(yīng)用程序開發(fā)中扮演幾個(gè)重要角色。在無線端,Java 2 Micro Edition(J2ME)為所有無線設(shè)備(從蜂窩電話到復(fù)雜的家用無線信息家電)提供了跨設(shè)備的兼容性、高級(jí)語(yǔ)言功能和大量庫(kù)。J2ME的一個(gè)關(guān)鍵組件是移動(dòng)信息設(shè)備框架(Mobile Information Device Profile:MIDP),它在蜂窩電話和低端PDA上定義Java API和運(yùn)行時(shí)環(huán)境。由于龐大數(shù)量的低端設(shè)備,期望在將來能夠廣泛部署MIDP。
從Web服務(wù)端,Java2Enterprise Edition(J2EE)已經(jīng)具有所有必需的API和庫(kù)存處理Web服務(wù)XML消息。通過Web服務(wù)接口或網(wǎng)關(guān),可以方便地將用 EJB技術(shù)實(shí)現(xiàn)的核心J2EE功能、JDBC API和RMI API用于外部世界。為了將這些特性集合起來并啟用無線Web服務(wù)應(yīng)用程序,還提出了J2MEWeb服務(wù)規(guī)范,目前它應(yīng)用在JavaCommunityProcess中。
雖然無線Web服務(wù)在普及移動(dòng)商業(yè)世界中應(yīng)用廣泛,但當(dāng)前技術(shù)仍不成熟。安全性仍是剩下待解決的問題之一。本文將討論一種常用的安全性技術(shù)——數(shù)字簽名,研究如何在 XML 消息中使用數(shù)字簽名來保證端對(duì)端的數(shù)據(jù)完整性,以及在當(dāng)前 MIDP 設(shè)備上使用數(shù)字簽名的可行性。
二、使用數(shù)字簽名保證數(shù)據(jù)完整性
數(shù)據(jù)完整性是通信安全性的最重要方面之一。數(shù)據(jù)通信在無線因特網(wǎng)上特別容易受到攻擊,而一種及時(shí)出現(xiàn)的援救工具是公鑰基礎(chǔ)設(shè)施(Public Key Infrastructure:PKI)和數(shù)字簽名。在 PKI 數(shù)字簽名模式中,每一方都有兩個(gè)密碼術(shù)密鑰:公鑰可以被任何人使用;而私鑰是保密的,只有某個(gè)人本身可以使用。用私鑰加密的消息只能由相應(yīng)的公鑰正確解密。當(dāng)發(fā)送方發(fā)送消息時(shí),他可以將相同消息的私鑰加密版及他的公鑰與該消息一起發(fā)送。接收方使用發(fā)送方的公鑰來解密加密版本。如果它與明文消息匹配,那么接收方可以知道該消息確實(shí)可信。該消息的私鑰加密版用作完整性驗(yàn)證記號(hào),我們將它稱為“數(shù)字簽名”。
因?yàn)樵枷⒖赡芟喈?dāng)長(zhǎng),而且生成和驗(yàn)證數(shù)字簽名的公鑰算法計(jì)算復(fù)雜度是指數(shù)級(jí)的,所以發(fā)送方通常計(jì)算稱為“摘要”的原始消息的短版本并且僅對(duì)該版本進(jìn)行數(shù)字形式的簽署。摘要具有固定長(zhǎng)度,它是任何長(zhǎng)度的輸入消息的單向散列;其計(jì)算速度非??臁=邮辗绞紫闰?yàn)證接收的消息是否產(chǎn)生正確摘要。如果該摘要不匹配,則在執(zhí)行任何公鑰算法之前拒絕該消息。這可以有助于防止攻擊造成堵塞,在這種攻擊中,攻擊者通過用偽造的公鑰請(qǐng)求填斥服務(wù)器,以耗盡它的計(jì)算資源。
在大多數(shù)實(shí)際應(yīng)用程序中,公鑰本身由可信的權(quán)威部門進(jìn)行數(shù)字簽名,并成為“數(shù)字證書”來驗(yàn)證發(fā)送方的標(biāo)識(shí)。不過,數(shù)字證書的處理不在本文范圍內(nèi),所以在下列示例中,將假設(shè)發(fā)送方是可信的并使用未簽署的公鑰來說明方法。
三、對(duì)XML進(jìn)行數(shù)字簽名
XML正成為Web服務(wù)世界中一個(gè)主要的數(shù)據(jù)交換協(xié)議。驅(qū)動(dòng) Web服務(wù)的XML消息在到達(dá)目的地之前,通常需要經(jīng)過多個(gè)中間環(huán)節(jié)。因此,保護(hù)從端到端的通信內(nèi)容是重要的。完成這一任務(wù)的最好方法是,將XML文檔及其安全性信息(如簽名、摘要和密鑰等等)都裝運(yùn)在一起,作為單個(gè)文檔。
XML數(shù)字簽名是將數(shù)字簽名添加到XML文檔的W3C規(guī)范。發(fā)送方可以選擇對(duì)整個(gè)文檔或者僅它的一部分進(jìn)行數(shù)字簽名。數(shù)字簽名、摘要和公鑰被格式化成XML元素。那些安全性信息的額外元素可以封裝整個(gè)原始XML消息,或者可以將它們嵌入原始消息。為方便起見,將在本文中使用封裝格式。另外,將密鑰分成幾個(gè)參數(shù)并將那些參數(shù)傳遞到公鑰元素KeyInfo下的單獨(dú)XML元素中,以代替使用編碼的公鑰證書。這在密鑰和處理它們的Java代碼之間建立了更明顯的連接。
四、使用Bouncy Castle Crypto API進(jìn)行數(shù)字簽名和驗(yàn)證的完整實(shí)現(xiàn)步驟
由于篇幅有限,本文將簡(jiǎn)略地論述XML數(shù)字簽名規(guī)范,以及Bouncy Castle密鑰生成器、編碼引擎、數(shù)字簽名簽名引擎和摘要引擎的用法。Bouncy Castle是一種用于 Java 平臺(tái)的開放源碼的輕量級(jí)密碼術(shù)包。它支持大量的密碼術(shù)算法,并提供JCE 1.2.1的實(shí)現(xiàn)。因?yàn)?Bouncy Castle 被設(shè)計(jì)成輕量級(jí)的,所以它都可以在從J2SE 1.4到J2ME的各平臺(tái)運(yùn)行。它是在MIDP上運(yùn)行的惟一完整的密碼術(shù)包。
Bouncy Castle Crypto API對(duì)J2ME應(yīng)用程序中XML文檔進(jìn)行數(shù)字簽名和驗(yàn)證的完整實(shí)現(xiàn)過程,如步驟圖所示:
五、具體實(shí)現(xiàn)代碼分析
Bouncy Castle Crypto包提供幾個(gè)使用DSA、RSA 和 ECC算法的簽名引擎類來簽署和驗(yàn)證消息。本文將詳細(xì)討論如何使用RSA 簽名引擎來簽署并驗(yàn)證數(shù)字簽名。那些簽名引擎使用不同的算法和不同的密鑰,并且需要不同的參數(shù)。本文還將討論如何將安全性信息(簽名、摘要和公鑰)嵌入XML文檔,以及比較三個(gè)簽名引擎并提出今后的改進(jìn)建議。
在上述生成“隨機(jī)的密鑰對(duì)”代碼中,RSASigUtil.generateKeys()方法使用 Exponent 生成隨機(jī)的密鑰對(duì),這個(gè)步驟通常由中央認(rèn)證中心在脫機(jī)狀態(tài)下完成。公鑰以參數(shù) Modulus 來描述,并且用 pubKey.getModulus() 方法來檢索它。下面的代碼說明了 RSAUtil 類中的方法。這些方法檢索 Exponent 和 Modulus模型及密鑰參數(shù),它們是重新構(gòu)造公鑰對(duì)象所必需的。
通過使用生成的私鑰,實(shí)用程序類 RSASigUtil 可以從摘要獲取一個(gè)字節(jié)數(shù)組 RSA 簽名:
服務(wù)器將摘要、簽名和密鑰參數(shù)編碼成ASCII文本格式并以XML數(shù)字簽名格式嵌入該文本:
驗(yàn)證MIDP應(yīng)用程序從 XML 文檔解析出摘要、密鑰參數(shù)和簽名,重新構(gòu)造公鑰并使用下列方法來驗(yàn)證簽名:
以上測(cè)試說明了無線設(shè)備上的 XML 解析和摘要生成都非??臁F渲饕男阅芷款i是公鑰算法的速度很慢。Bouncy Castle Crypto 包提供幾個(gè)使用 DSA、RSA 和 ECC 算法的簽名引擎類來簽署和驗(yàn)證消息。但在實(shí)際設(shè)備中,它們并不都是實(shí)用的,因?yàn)?Bouncy Castle Crypto 包完全基于Java 語(yǔ)言,所以它在沒有特殊優(yōu)化的情況下依靠很慢的 JVM 來執(zhí)行甚至是最密集的大整數(shù)數(shù)學(xué)運(yùn)算。結(jié)果只有 RSA 算法提供了一個(gè)合理的性能,而且是可以接受的。它只要花很少的時(shí)間就可以在16MHz Palm VII 設(shè)備上驗(yàn)證具有1024位公鑰的簡(jiǎn)單數(shù)字簽名。雖然如此,驗(yàn)證進(jìn)程在任何實(shí)際的應(yīng)用程序中還是必須作為后臺(tái)線程運(yùn)行,以避免用戶界面鎖定。
DSA和ECC算法性能在其當(dāng)前實(shí)現(xiàn)中是不可接受的。具有 1024位密鑰的DSA簽名和具有192位密鑰的ECC簽名要花大量時(shí)間在標(biāo)準(zhǔn)的Palm VII MIDP上進(jìn)行驗(yàn)證。性能問題強(qiáng)烈需要我們需要為大整數(shù)數(shù)學(xué)運(yùn)算和公鑰算法對(duì)JVM 進(jìn)行優(yōu)化。JVM 還必須利用可用的特殊硬件和底層的OS功能來促進(jìn)與安全性相關(guān)的數(shù)學(xué)運(yùn)算。公鑰算法用于安全連接(如 HTTPS)中的信息交換。許多當(dāng)前的 MIDP VM 可以用合理的性能來支持 HTTPS 協(xié)議。MIDP4Palm VM 可以利用 Palm OS 的底層的 inethttps 協(xié)議來建立安全連接??梢韵胂笪磥淼腣M和核心語(yǔ)言庫(kù)不僅優(yōu)化與安全連接相關(guān)的公鑰操作,而且還使優(yōu)化可用于一般安全性功能(如數(shù)字簽名)。
六、結(jié)束語(yǔ)
在 Bouncy Castle 提供的所有算法中,只有 RSA 算法提供了無線設(shè)備上可以接受的性能。然而,未來在 MIDP 運(yùn)行環(huán)境上的進(jìn)步可以使數(shù)字簽名更易于移動(dòng)用戶使用。
參考文獻(xiàn):
[1] Alfred J. Menezes、Paul C. Van Oorschot、Scott A. Vanstone. Handbook of Applied Cryptography[M]. CRC Press. 1996
[2]http://www.w3.org/TR/xmldsig-core/ XML-Signature Syntax and Processing. W3C 2002
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文。