王金偉, 馬希榮, 孫德兵
(1.天津大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,天津300072;2.天津師范大學(xué)計(jì)算機(jī)與信息工程學(xué)院,天津300387)
身份認(rèn)證是對網(wǎng)絡(luò)訪問者合法性的確認(rèn),是整個(gè)網(wǎng)絡(luò)安全體系的基礎(chǔ)[1]。公鑰基礎(chǔ)設(shè)施(public key infrastructure,PKI)的出現(xiàn)為身份認(rèn)證提供了一種有效機(jī)制,它采用數(shù)字證書作為密鑰管理媒介,通過以非對稱加密算法為基礎(chǔ)的數(shù)字簽名技術(shù)實(shí)現(xiàn)了對用戶身份真實(shí)性的確認(rèn)[2]。數(shù)字證書是PKI的核心,它包含了用戶的公鑰和其他標(biāo)志信息。目前,對現(xiàn)有網(wǎng)絡(luò)應(yīng)用系統(tǒng)進(jìn)行安全升級的方案中,數(shù)字證書的載體主要是瀏覽器和USB-KEY,前者不但缺乏移動性,而且存在很大安全隱患,不是理想的解決方案;后者雖然具有良好的移動性和安全性,但制作和分發(fā)成本高昂,升級過程也非常復(fù)雜。針對以上問題,我們設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)以PKI安全體系為基本框架,采用普通U盤作為數(shù)字證書載體的身份認(rèn)證系統(tǒng)。該系統(tǒng)在保證用戶使用數(shù)字證書的移動性、安全性和便利性的同時(shí),大大降低了與現(xiàn)有應(yīng)用系統(tǒng)集成的成本和復(fù)雜性。
如圖1所示,一個(gè)典型的PKI體系結(jié)構(gòu)主要包括3類實(shí)體:管理實(shí)體,端實(shí)體和證書庫[3]。
管理實(shí)體是PKI的核心部件,是PKI服務(wù)的提供者。管理實(shí)體有兩種:證書中心CA和注冊中心RA。CA在PKI體系中的作用是維護(hù)證書的生命周期,具體工作是發(fā)布和撤銷證書;RA負(fù)責(zé)對用戶請求進(jìn)行處理,若驗(yàn)證請求有效,則代表用戶向CA提交請求。RA可以單獨(dú)實(shí)現(xiàn),也可以合并在CA中實(shí)現(xiàn)。CA和RA以證書方式向端實(shí)體提供公鑰的分發(fā)服務(wù)。
端實(shí)體是PKI的用戶,是PKI服務(wù)的使用者。端實(shí)體有兩種:持證者和驗(yàn)證者。持證者一般為應(yīng)用系統(tǒng)的用戶,是數(shù)字證書的所有者;持證者向管理實(shí)體申請并獲取數(shù)字證書,在需要時(shí)撤銷或更新證書。持證者使用數(shù)字證書證實(shí)自己的身份,從而可以獲得相應(yīng)的權(quán)限。驗(yàn)證者一般是網(wǎng)絡(luò)應(yīng)用系統(tǒng),即授權(quán)方,它一方面需要鑒別持證者提供證書的有效性,另一方面還要驗(yàn)證持證者是否為該證書的真正擁有者,只有在鑒別和驗(yàn)證成功之后才會授予持證者相應(yīng)的權(quán)限。

圖1 PKI體系結(jié)構(gòu)
證書庫存儲兩種信息:由CA簽名的有效數(shù)字證書和已撤銷證書的列表(CRL)。以上幾種實(shí)體之間可通過PKI操作進(jìn)行通信,包括證書的請求、確認(rèn)、發(fā)布、獲取、更新和撤銷等過程。
PKI頒發(fā)給用戶的身份標(biāo)識就是數(shù)字證書,其數(shù)學(xué)理論基礎(chǔ)是非對稱加密算法,就是采用互相匹配的一對密鑰進(jìn)行加和解密。每位用戶持有一把私鑰,該私鑰僅為本人所有,用于簽名和解密;還持有一把與私鑰配對的公鑰,用于驗(yàn)證簽名和加密。用其中一把密鑰加密的信息,只能由對應(yīng)的另一把密鑰才能夠破解。將用戶的信息和公鑰封裝起來并由CA進(jìn)行數(shù)字簽名就形成了用戶的數(shù)字證書。
目前,PKI體系中應(yīng)用最為廣泛、也是最為基礎(chǔ)的一個(gè)數(shù)字證書國際標(biāo)準(zhǔn)是X.509標(biāo)準(zhǔn)[4],其格式如表1所示。其中,序列號是由CA分配給證書的唯一標(biāo)識符。簽名算法用來指定證書中心CA簽發(fā)證書時(shí)所使用的非對稱加密算法和哈希算法。持有者是證書擁有者的名字和信息,包括國家、省市、地區(qū)、組織機(jī)構(gòu)、單位部門和通用名,還可包含電子郵箱地址等信息。公鑰部分包含了公鑰的值和公鑰使用的算法標(biāo)識符。在X.509第2版(v2)中加入了簽發(fā)者和持有者的唯一標(biāo)識符,第3版(v2)又加入了擴(kuò)展域。

表1 X.509證書格式
本課題設(shè)計(jì)的身份認(rèn)證系統(tǒng)主要針對Web網(wǎng)絡(luò)應(yīng)用,其體系結(jié)構(gòu)以PKI為基礎(chǔ),并根據(jù)B/S模型進(jìn)行了一定的簡化和補(bǔ)充。系統(tǒng)的總體結(jié)構(gòu)如圖2所示。

圖2 身份認(rèn)證系統(tǒng)總體結(jié)構(gòu)
整個(gè)系統(tǒng)包含瀏覽器端和服務(wù)器端兩大部分。服務(wù)器端包括CA模塊、認(rèn)證模塊、證書數(shù)據(jù)庫和管理員模塊幾個(gè)部分,各模塊的功能如下:
(1)CA模塊。為了簡化證書處理過程,本系統(tǒng)將證書中心CA和注冊中心RA合并為一個(gè)模塊,作為系統(tǒng)的基礎(chǔ)模塊。該模塊同時(shí)完成CA和RA的功能。包括:受理用戶對數(shù)字證書請求的申請;頒發(fā)數(shù)字證書給用戶;受理用戶對數(shù)字證書撤銷或更新的申請;維護(hù)已撤銷證書的列表。
(2)認(rèn)證模塊。該模塊是整個(gè)系統(tǒng)的核心,它的主要功能是通過“挑戰(zhàn)/應(yīng)答”協(xié)議確認(rèn)用戶的合法身份,其中含有對用戶所持證書有效性的驗(yàn)證。
(3)證書數(shù)據(jù)庫。證書數(shù)據(jù)庫中存儲的內(nèi)容有:X.509證書、已撤銷證書的列表和持證用戶信息等。
(4)管理員模塊。該模塊用于管理CA模塊,具體工作包括:對用戶提出的請求、撤銷和更新數(shù)字證書的申請進(jìn)行審核,并將審核結(jié)果反饋給用戶;對用戶證書的詳細(xì)信息和當(dāng)前狀態(tài)進(jìn)行查詢;對證書數(shù)據(jù)庫進(jìn)行備份,以防止因誤操作或重裝系統(tǒng)等造成數(shù)字證書的丟失,降低對用戶正常操作的影響;對用戶的非法操作等異常情況進(jìn)行處理,如注銷無效證書。
瀏覽器端包括用戶模塊和集成接口兩部分,它們的功能如下:
(1)用戶模塊:該模塊的功能包括:向CA模塊遞交用戶對數(shù)字證書的請求、撤銷和更新的申請;將數(shù)字證書下載到U盤;從U盤中讀取數(shù)字證書;配合認(rèn)證模塊對用戶身份的合法性進(jìn)行確認(rèn)。
(2)集成接口:為了使現(xiàn)有應(yīng)用系統(tǒng)能夠方便地使用本系統(tǒng)的功能,設(shè)計(jì)了集成接口,該接口可以和應(yīng)用系統(tǒng)的瀏覽器端進(jìn)行集成。
現(xiàn)有PKI系統(tǒng)普遍采用瀏覽器或USB-KEY作為用戶數(shù)字證書的載體。保存在瀏覽器中的證書缺乏移動性和安全性。用戶在不同計(jì)算機(jī)上登錄網(wǎng)絡(luò)應(yīng)用系統(tǒng),需要重新下載證書,并且在退出系統(tǒng)時(shí),證書不能自動從瀏覽器上刪除。如果計(jì)算機(jī)是公用的,且用戶忘記刪除證書,那么使用這臺計(jì)算機(jī)的其他人也可以獲得其證書,這樣就存在很大安全隱患。
將證書保存在USB-KEY中,雖然具有良好的移動性和安全性,但對于已有的網(wǎng)絡(luò)應(yīng)用系統(tǒng),需要重新制作和分發(fā)USBKEY,致使系統(tǒng)的升級成本非常昂貴,升級過程也十分繁瑣。尤其對那些需要提高安全性同時(shí)已經(jīng)擁有大量用戶的互聯(lián)網(wǎng)應(yīng)用,如電子郵件,電子教務(wù),電子政務(wù)和第三方支付等更是難以實(shí)現(xiàn)。而對用戶來說,額外購買或領(lǐng)取USB-KEY以及在平時(shí)攜帶許多不同系統(tǒng)的USB-KEY,必然會帶來很多不便。
相比以上兩種方式,本系統(tǒng)使用U盤作為數(shù)字證書的載體,其突出優(yōu)點(diǎn)如下:
(1)具有良好的移動性和安全性。用戶可以隨身攜帶,不用反復(fù)下載數(shù)字證書。使用完后U盤被用戶隨即取走,證書不會保留在計(jì)算機(jī)中。
(2)升級成本低,使用方便。目前,U盤的價(jià)格已經(jīng)十分低廉,同時(shí)大部分手機(jī)也具備U盤功能,可以說U盤幾乎是人手一個(gè)。因此,用U盤作為證書的載體,一方面使現(xiàn)有應(yīng)用系統(tǒng)不用承擔(dān)采購、分發(fā)USB-KEY所帶來的昂貴成本和繁瑣過程;另一方面使用戶避免了因額外領(lǐng)取或購買USB-KEY而造成的不便。
(3)可存放多個(gè)證書。因數(shù)字證書的體積很小,同一個(gè)U盤可以存放多個(gè)應(yīng)用系統(tǒng)的證書,避免了用戶同時(shí)攜帶很多USB-KEY。
為了進(jìn)一步提高U盤中數(shù)字證書的安全性,本系統(tǒng)采用了“口令+證書”的雙因子驗(yàn)證機(jī)制[5]。每個(gè)分發(fā)給用戶的數(shù)字證書均設(shè)有使用口令,用戶在使用證書時(shí)需要先輸入口令,口令正確方可使用。
雙因子驗(yàn)證機(jī)制使口令和證書構(gòu)成了用戶身份的兩個(gè)必要因素。用戶只有同時(shí)取得了證書和使用證書的口令,才可以證實(shí)其真實(shí)身份。即使用戶的口令泄漏,只要用戶持有的證書不被盜取,合法用戶的身份就不會被仿冒;如果用戶的證書遺失,拾到者由于不知道使用口令,也無法仿冒合法用戶的身份。
為了便于管理,本系統(tǒng)的CA模塊將直接產(chǎn)生用戶密鑰對,并將數(shù)字證書和私鑰封裝成證書文件在發(fā)放證書時(shí)一起交給用戶,該過程的具體流程如下:
(1)申請者首先使用用戶模塊填寫相應(yīng)的信息,然后向CA模塊提交數(shù)字證書申請;
(2)CA模塊對申請者提交的申請進(jìn)行受理,然后提交給管理員審核;
(3)管理員將申請中提供的信息與各種必要條件進(jìn)行比對,決定是否通過該申請;
(4)CA模塊在申請審核通過后,將為申請者生成一對公私密鑰(采用非對稱加密算法);
(5)申請者的信息和公鑰被CA模塊封裝成X.509數(shù)字證書并保存到證書數(shù)據(jù)庫中。隨后,該數(shù)字證書和用戶私鑰被進(jìn)一步封裝成證書文件;
(6)用戶模塊通知申請人下載證書文件,并提示申請人將其存放在U盤中;
(7)整個(gè)申請過程結(jié)束,申請者的合法用戶身份得到確立。
系統(tǒng)采用“挑戰(zhàn)/應(yīng)答”協(xié)議[6]進(jìn)行身份認(rèn)證,該協(xié)議由用戶模塊和認(rèn)證模塊的幾輪對話來完成,具體過程如圖3所示。

圖3 “挑戰(zhàn)/應(yīng)答”身份認(rèn)證協(xié)議
(1)數(shù)字證書的持有用戶通過用戶模塊向認(rèn)證模塊請求身份認(rèn)證;
(2)收到請求后,認(rèn)證模塊馬上生成一個(gè)隨機(jī)數(shù)RP,反饋給用戶模塊,作為“挑戰(zhàn)”;
(3)用戶模塊要求用戶輸入密碼,若密碼正確,則從U盤(與用戶的計(jì)算機(jī)相連接)中讀出該用戶的私鑰,若密碼錯(cuò)誤,則不能通過驗(yàn)證;
(4)用戶模塊使用用戶的私鑰將隨機(jī)數(shù)RP加密 (數(shù)字簽名),結(jié)果為SC(RP),并將該結(jié)果和用戶的數(shù)字證書SCertC提交給認(rèn)證模塊進(jìn)行檢查;
(5)認(rèn)證模塊先后對數(shù)字證書SCertC的路徑、完整性以及CA的簽名進(jìn)行檢查,之后還要查詢該證書是否在CA提供的已撤銷證書列表中;若SCertC通過以上檢查則說明其有效,那么認(rèn)證模塊將提取SCertC中的公鑰,利用該公鑰解密SC(RP),得到結(jié)果REP;最后,認(rèn)證模塊將之前生成的隨機(jī)數(shù)RP和解密結(jié)果REP進(jìn)行對比,若兩者完全相等,則用戶的合法身份得到確認(rèn),否則就是非法用戶。
在“挑戰(zhàn)/應(yīng)答”協(xié)議中,每次對用戶身份進(jìn)行認(rèn)證時(shí)都會生成一個(gè)獨(dú)立的隨機(jī)數(shù),即使黑客通過某種手段截獲該隨機(jī)數(shù),也無法逆推得到密鑰,由此就排除了用戶身份被仿冒的可能性。
認(rèn)證系統(tǒng)的服務(wù)器端安裝了Linux操作系統(tǒng),開發(fā)腳本為PHP語言,以Apache為Web解析服務(wù)器。PKI的各種功能均采用OpenSSL軟件包進(jìn)行開發(fā),數(shù)字證書庫用MySQL數(shù)據(jù)庫實(shí)現(xiàn)。
OpenSSL[7-8]是一個(gè)著名的開源軟件包,它以標(biāo)準(zhǔn)C語言作為軟件開發(fā)語言,實(shí)現(xiàn)了很多加解密算法、SSL協(xié)議和PKI標(biāo)準(zhǔn);OpenSSL能夠跨平臺運(yùn)行,支持Windows、Linux和Mac等主流操作系統(tǒng),適用性非常廣泛;OpenSSL軟件包的主要組成部分有:ssleay函數(shù)庫和實(shí)用應(yīng)用程序;ssleay函數(shù)庫提供了兩千多個(gè)函數(shù)實(shí)現(xiàn),是OpenSSL軟件包的核心部分,這些函數(shù)實(shí)現(xiàn)涵蓋了當(dāng)前安全系統(tǒng)中常用的非對稱、對稱加解密算法。
為了提高運(yùn)行效率,服務(wù)器端的PKI功能直接使用ssleay函數(shù)庫進(jìn)行開發(fā)。這些功能包括:生成用戶公私密鑰對,生成、發(fā)布、驗(yàn)證、注銷和更新X.509數(shù)字證書等。在生成公私密鑰對時(shí)采用了1024位密鑰和RSA非對稱加密算法[9]。
為了幫助用戶確保數(shù)字證書和密鑰之間的對應(yīng)關(guān)系,系統(tǒng)使用 ssleay函數(shù),將用戶的 X.509證書和私鑰封裝成PKCS#12證書文件,供用戶下載。PKCS標(biāo)準(zhǔn) (the public-key cryptography standards)是美國RSA數(shù)據(jù)安全公司聯(lián)合其合作伙伴共同制定的一組公鑰密碼學(xué)標(biāo)準(zhǔn);該標(biāo)準(zhǔn)主要用于對加密算法、數(shù)字簽名、數(shù)據(jù)封裝、數(shù)字證書和用戶私有信息進(jìn)行規(guī)范;其中的PKCS#12標(biāo)準(zhǔn)對用戶的私鑰、公鑰、數(shù)字證書和其他相關(guān)信息的整合方法進(jìn)行了詳細(xì)的描述[10]。PKCS#12證書文件在將用戶私鑰和X.509證書封裝起來的同時(shí),還實(shí)現(xiàn)了雙因子認(rèn)證,即對用戶私鑰設(shè)置了提取口令。
為了與PHP腳本整合,系統(tǒng)把利用ssleay函數(shù)庫開發(fā)的各種PKI功能編譯封裝成一個(gè)PHP擴(kuò)展。服務(wù)器端的CA模塊、認(rèn)證模塊和管理員模塊在其PHP實(shí)現(xiàn)中都通過調(diào)用該擴(kuò)展來完成相應(yīng)的功能。
系統(tǒng)的瀏覽器端采用了CAPICOM組件進(jìn)行實(shí)現(xiàn)。CAPICOM[11]組件是微軟提供的一個(gè)標(biāo)準(zhǔn)密碼應(yīng)用層中間件接口,該接口可以在Windows環(huán)境下的各種編程語言中調(diào)用;CAPICOM組件中的大多數(shù)接口可以在網(wǎng)頁腳本中安全地使用。
在實(shí)現(xiàn)本系統(tǒng)的用戶模塊時(shí),采用了Visual Basic語言并調(diào)用了CAPICOM的2.0版組件。用戶模塊的實(shí)現(xiàn)形式為ActiveX,它能夠嵌入到Web頁面中。用戶如果是首次訪問,系統(tǒng)會提示安裝用戶模塊。
在身份認(rèn)證過程中,當(dāng)用戶模塊收到認(rèn)證模塊發(fā)送的隨機(jī)數(shù)后,會逐一搜索并識別與用戶計(jì)算機(jī)連接的所有存儲設(shè)備,如果找到U盤,則搜索U盤中是否存有PKCS#12證書文件,找到后提取文件中用戶的私鑰對隨機(jī)數(shù)簽名,若沒找到U盤或證書文件則認(rèn)證失敗。
該過程的部分關(guān)鍵代碼如下:


其中,過程SearchUPan()的作用就是搜索并識別U盤,它返回證書文件的路徑;oSigner是簽名者對象,oCert是證書對象,strText是隨機(jī)數(shù),需要對它簽名,oSignedData存儲了需要簽名的信息。程序首先指定數(shù)字證書和被簽名數(shù)據(jù)(設(shè)置oSigner的Certificate屬性和oSignedData的Content屬性),然后執(zhí)行數(shù)字簽名(調(diào)用oSignedData的Sign方法),strSignedData就是簽名后的信息。
與應(yīng)用系統(tǒng)的集成接口實(shí)現(xiàn)為一個(gè)PHP文件,名為authentication.inc.php,它類似于C語言的頭文件,其中包含了身份認(rèn)證的主要函數(shù)。
在與應(yīng)用系統(tǒng)集成時(shí),需要考慮兩種情況:①應(yīng)用系統(tǒng)是用PHP語言實(shí)現(xiàn)的;②應(yīng)用系統(tǒng)是用其他腳本語言 (如ASP,JSP等)實(shí)現(xiàn)的。對于第一種情況,只需在應(yīng)用統(tǒng)的適當(dāng)頁面中加入以下兩句即可實(shí)現(xiàn)集成:
require_once("authentication.inc.php");
userCertVerify("認(rèn)證成功頁面","認(rèn)證失敗頁面");
第一句將authentication.inc.php文件包含進(jìn)來,第二句是調(diào)用的userCertVerify函數(shù)進(jìn)行身份認(rèn)證。若認(rèn)證成功則跳轉(zhuǎn)到“認(rèn)證成功頁面”,否則跳轉(zhuǎn)到“認(rèn)證失敗頁面”,這兩個(gè)頁面可以根據(jù)具體情況進(jìn)行設(shè)置。利用這種方法,該認(rèn)證系統(tǒng)已與本校網(wǎng)絡(luò)教務(wù)系統(tǒng)進(jìn)行了整合,并成功運(yùn)行。對于第二種情況,可以使用Ajax技術(shù)對認(rèn)證函數(shù)進(jìn)行遠(yuǎn)程調(diào)用[12],這是本課題下一步的研究方向。
本文提出了一種基于PKI和U盤的身份認(rèn)證系統(tǒng)。PKI構(gòu)架以數(shù)字證書作為證明用戶合法身份和提供用戶合法公鑰的憑證,結(jié)合非對稱加密技術(shù),可以有效保證用戶的身份安全和應(yīng)用系統(tǒng)的數(shù)據(jù)安全。用U盤作為數(shù)字證書的載體,不僅方便了用戶,保證了用戶數(shù)字證書的移動性和安全性,而且大幅度降低了應(yīng)用系統(tǒng)進(jìn)行升級的成本和復(fù)雜性,為現(xiàn)有網(wǎng)絡(luò)應(yīng)用系統(tǒng)提供了一種低成本的安全解決方案。
[1]李曉航,王宏霞,張文芳.認(rèn)證理論及應(yīng)用[M].北京:清華大學(xué)出版社,2009.
[2]荊繼武,林璟鏘,馮登國.PKI技術(shù)[M].北京:科學(xué)出版社,2008.
[3]Housley R,Polk W,Solo D.Internet X.509 public Key infrastructure,certificate and CRL Profile[S].RFC2459,2004.
[4]ITU-T recommendation X.509:information technology-open systems interconnection-the directory:authentication framework[S].2005.
[5]吳永英,鄧路.一種基于USBKey的雙因子身份認(rèn)證與密鑰交換協(xié)議[J].計(jì)算機(jī)工程與科學(xué),2007,29(5):56-59.
[6]陳賢,陳力瓊,闊永紅.不同密碼體制下挑戰(zhàn)-應(yīng)答協(xié)議的分析[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(10):2493-2495.
[7]王志海,童新海,沈寒輝.OpenSSL與網(wǎng)絡(luò)信息安全——基礎(chǔ)、結(jié)構(gòu)和指令[M].北京:清華大學(xué)出版社,2007.
[8]齊洪喜,周大水.基于OpenSSL的安全密碼平臺的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,28(2):314-315.
[9]趙小明,章美仁.RSA數(shù)字簽名技術(shù)在電子公文流轉(zhuǎn)中的應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2005,26(5):1214-1216.
[10]歐陽騫,劉翼光.基于PKCS#12的數(shù)字版權(quán)管理系統(tǒng)[J].計(jì)算機(jī)工程,2010,36(10):146-148.
[11]宋玲,李陶深,陳拓.用CAPICOM組件實(shí)現(xiàn)應(yīng)用系統(tǒng)安全性的方法[J].計(jì)算機(jī)工程,2004,30(16):128-129.
[12]Jesse James Garrett.Ajax:anewapproachtowebapplications[EB/OL].http://adaptivepath.com/publications/essays/archives/000385.php,2005.