王 煊,王志偉,2
(1.南京郵電大學計算機學院,江蘇 南京 210023; 2.江蘇省大數(shù)據(jù)安全與智能處理重點實驗室,江蘇 南京 210023)
在遍布人類生活每個角落的物聯(lián)網(wǎng)中,隱私安全是一項重大挑戰(zhàn)[1]。身份認證[2]是隱私保護的重要領域,目前提出的OpenID身份認證協(xié)議,構建在OAuth 2.0標準之上[3]。OpenID先后經(jīng)歷了OpenID1.0、OpenID1.1以及OpenID2.0,OpenID2.0是最終的穩(wěn)定版本[4],OpenID對企業(yè)未來的發(fā)展非常重要[5],故其安全性受到了重點關注。而OpenID身份認證協(xié)議作為一種單點登錄[6]認證協(xié)議,正在成為以用戶為中心的身份基礎設施的可行解決方案[7]。
OpenID協(xié)議在身份認證的整個過程當中,涵蓋了以下2個重要的參與方:
1)OpenID提供者(OpenID Provider, Idp):是一個OpenID的提供商網(wǎng)站[8],諸如Google和Microsoft等站點,用戶如果想要使用這個站點的OpenID,首先要在這個網(wǎng)站上進行注冊,申明自己的OpenID標識符。Idp負責對依賴方的身份進行驗證。
2)OpenID依賴方(Relying Party, RP):是一個支持OpenID的Web站點,用于用戶使用OpenID進行登錄時的操作。OpenID依賴方RP依據(jù)用戶輸入的標識符來發(fā)現(xiàn)Idp,然后請求Idp的認證,Idp的認證需要用戶的參與,輸入密碼確認用戶身份登錄OpenID的依賴方,然后Idp會將認證的結果返回給RP。RP使用非對稱加密[9]技術對Web上的用戶進行身份驗證,并根據(jù)認證的結果來決定是否允許用戶訪問資源[10]。
在目前的OpenID協(xié)議交互過程中,存在著一些安全性的問題亟待解決。一方面,身份提供商Idp可以通過登錄到OpenID依賴方的行為從而了解到用戶訪問了哪些RP、何時進行訪問以及訪問的頻率。另一方面,身份提供商通常情況下?lián)碛邪?jīng)過驗證的個人用戶屬性的用戶配置文件,這使得身份提供商可以將用戶訪問的RP數(shù)據(jù)信息鏈接到一個唯一確定身份的用戶,這樣就會泄露用戶的敏感信息。
當前用于隱私保護的OpenID協(xié)議有很多,Hammann等[11]在標準OpenID協(xié)議的基礎上做出改進,并提出POIDC協(xié)議成功解決了上述問題。協(xié)議的流程中通過屏蔽OpenID依賴方RP的網(wǎng)站標識符RPk,使得身份提供商Idp不再了解到用戶登錄的RP,具體采用的解決方法是使用散列值H(RPk||rp_nonce||u_nonce)替換直接發(fā)送給Idp的RPk,其中u_nonce表示一個加密安全、不可預測的隨機值,由于u_nonce是由瀏覽器(用戶代理)生成的,這樣Idp后端就不會知道它對應的值;rp_nonce是RP為重放保護而生成的nonce值。在哈希中包含rp_nonce,交互的過程不必以明文形式進行發(fā)送,使得Idp不可以從rp_nonce獲取關于RP的任何信息。通過實驗分析可知,該協(xié)議在效率方面的表現(xiàn)并不是很好,散列值H(RPk||rp_nonce||u_nonce)在id_token當中被包含,而id_token的使用不但面臨著證書管理難度大、開銷高的問題,而且RP需要對收到的id_token進行驗證操作,這使得協(xié)議的效率因此變低。
為了解決Hammann等[11]提出的POIDC協(xié)議中的問題,本文在POIDC協(xié)議的基礎上設計一種基于SM9盲簽名的OpenID協(xié)議,該協(xié)議不但使得身份提供商Idp不再了解到用戶登錄的RP,保護了用戶消息隱私,而且由于本文提出的協(xié)議是基于身份基盲簽名方案,避免了id_token的使用,解決了證書管理難度大、開銷高的問題,并且減少了計算量和通信量,因此協(xié)議的效率得到了提高。
在OpenID協(xié)議中引入盲簽名,使得簽名者Idp在不知道具體消息內(nèi)容的情況下對消息進行簽名,且Idp無法將簽名過程以及得到的簽名鏈接在一起,因此,協(xié)議在雙向認證、抵抗假冒攻擊等方面表現(xiàn)良好。1982年,Chaum[12]提出了盲簽名概念,使用盲簽名方案,用戶可獲得對消息的簽名,但不透露有關其簽名的任何信息,該方案可以確保不可追蹤性和不可鏈接性[12-14]。
本文的身份基盲簽名方案以SM9國密算法[15]為基礎,不需要傳統(tǒng)公鑰加密[16]體制中的認證機構對用戶證書進行管理。SM9國密算法為身份基簽名算法,整個系統(tǒng)中不需要證書,消除了復雜的證書驗證過程?!毒W(wǎng)絡安全等級保護條例》對信息系統(tǒng)使用國密算法有相應的要求,這使得在OpenID協(xié)議中使用SM9國密算法是有意義的。本文將SM9改造為身份基盲簽名,不僅實現(xiàn)了隱私保護,而且相較基于RSA體制[17]的盲簽名算法,簽名時間大幅減少,有著非常好的效率,這使得將SM9盲簽名用于OpenID協(xié)議中具有現(xiàn)實意義。
因為Castagnos等[18]提出的同態(tài)加密方案具有密文格式良好的特征,所以在本文的SM9盲簽名方案中,使用Castagnos等[18]提出的方案實現(xiàn)對消息的盲化。同態(tài)加密技術始于概率加密方案,由Goldwasser等[9]提出,并隨后由其他的密碼學者做出改進,其中最成功的同態(tài)加密系統(tǒng)是由Paillier[19]設計的,但是該同態(tài)加密系統(tǒng)仍然存在著2個缺陷,一是需要建立可信的第三方,二是它的安全性基于RSA大整數(shù)分解困難問題,由于RSA群上的元素比較多,所以通信效率會比較低。在此背景下,Castagnos等[18]提出了一種基于DDH問題的線性同態(tài)加密方案,并在隨后進行了相應擴展,提供了一個同態(tài)加密方案[20],該方案不需要建立可信的第三方,它的安全性不依賴于大整數(shù)分解的困難性,并在HSM(Hard Subgroup Membership)群內(nèi)提供了實現(xiàn),隨后Yuen[21]對該方案進行了效率分析。
雙線性對(Bilinear Pairing)又被稱為雙線性映射[22]。
定義1G1是由P生成的階為q的循環(huán)加法群。雙線性對e滿足:
非退化性:e(P,P)≠1。
易計算性:對于?P,Q∈G1,存在有效算法,可計算出e(P,Q)。
KGC是密鑰生成中心,用戶根據(jù)保存的秘密值和公開參數(shù)生成簽名公私鑰[23]。提出的SM9盲簽名方案如圖1(見3.1節(jié))所示。
1)參數(shù)設置階段。
2)密鑰生成階段。
輸入簽名者的身份ID∈{0,1}*,KGC計算QID=H1(ID),輸出簽名者私鑰dA=sQID,具體的步驟與SM9算法中一致。
3)盲化階段。
4)簽名階段。
②將計算之后的(C1,C2)發(fā)送給用戶。
5)解盲階段。
6)簽名驗證階段。
用戶得到消息M′的盲簽名后,向驗證者發(fā)送驗證請求。驗證者進入驗證簽名階段,隨后驗證者應當進行如下的步驟:
①檢驗h是否在[1,N-1]內(nèi),若不在規(guī)定范圍,則驗證不通過;②將m轉(zhuǎn)換為橢圓曲線上的點,判斷m是否為G1中元素,若不是,驗證不通過;③在群GT上計算g=e(P,Ppub);④在群GT上計算t=gh;⑤計算h1=H1(IDK||hid,N);⑥在群G2上計算P′=[h1]P2+Ppub;⑦在群GT上計算u=e(U,P′);⑧在群GT上計算w′=μt,將w′轉(zhuǎn)換為比特串;⑨計算h2=H2(M″ ||w′,N),判斷整數(shù)h2和h是否相同,若相等,則驗證通過,否則不予通過。
對身份基盲簽名方案的安全性分析包括對不可偽造性和盲性的分析。對身份基盲簽名方案進行不可偽造性證明時,需要引入安全模型。常見的身份基盲簽名方案涉及3個實體:簽名者、驗證者以及用戶。本文的身份基盲簽名方案由以下算法構成。1)系統(tǒng)建立算法:由KGC執(zhí)行,輸入安全參數(shù)λ,輸出系統(tǒng)公共參數(shù)params。2)密鑰生成算法:由KGC執(zhí)行,輸入簽名者身份ID和params,輸出簽名者私鑰dA。3)盲簽名算法:由用戶和簽名者交互式完成,輸入params、消息M、簽名者私鑰dA,最后生成簽名,它還包含了3個子算法,即盲化、簽名、解盲。4)驗證算法:由驗證者執(zhí)行該算法,輸入params、消息M和簽名,驗證簽名有效性,若驗證有效則通過,否則不予通過。
身份基盲簽名方案不可偽造性可以定義為以下游戲。1)設置:挑戰(zhàn)者C運行設置算法并將公共參數(shù)發(fā)送給攻擊者A。然后,C執(zhí)行密鑰生成算法并發(fā)送公鑰給A。2)查詢:攻擊者A可以進行身份私鑰查詢和簽名查詢,挑戰(zhàn)者C返回查詢結果。3)輸出:攻擊者針對挑戰(zhàn)身份ID*和消息M*生成簽名σ*并返回。如果簽名σ*合法,且(ID*,M*)未進行過簽名查詢,那么說明攻擊者A贏得了上面的游戲。
定義2 不可偽造性。如果對于任何概率多項式時間攻擊者A,A贏得游戲的概率是可忽略的,那么該身份基盲簽名方案是不可偽造的。
定理1 本文SM9盲簽名方案不可偽造性依賴于SM9簽名的安全性。
證明。在這個證明游戲中有3個角色:A代表本文盲簽名的攻擊者,B代表本文SM9盲簽名方案的挑戰(zhàn)者,B同時也是SM9簽名的攻擊者,C則是SM9簽名的挑戰(zhàn)者。
查詢。攻擊者A可以發(fā)起概率多項式次私鑰查詢和簽名查詢。
2)簽名查詢:當攻擊者A對身份ID和消息M進行簽名查詢時,如果ID′尚未進行身份基私鑰查詢,則B先對ID進行私鑰查詢。如果已進行過查詢,則B將身份ID′和消息M′發(fā)給C進行SM9簽名查詢。C返回SM9簽名應答σ={h,m,w},B隨機選擇盲因子k1∈Zn*,則另一個盲因子為k2=w/k1。B計算ε=(k1+1)dAw,利用參數(shù)param′′和公鑰pk生成密文C1=fmpkε和C2=gqε,將其作為盲簽名應答返回給A。
定義3 盲性。對于消息M,A可在多項式時間內(nèi)根據(jù)簽名推測消息為M*,若M與M*相同的概率是可忽略不計的,則方案具有盲性。
定理2 本文的SM9盲簽名方案滿足盲性。
協(xié)議的流程如圖1所示。
圖1 OpenID協(xié)議流程圖
1)用戶使用他的用戶代理(通常是Web瀏覽器),通過請求登錄OpenID依賴方RP來發(fā)起協(xié)議,他會指定要使用哪個Idp。例如,通過點擊RP網(wǎng)頁上相應的按鈕,這將觸發(fā)用戶代理對RP發(fā)起請求。
2)RP將用戶代理重定向到身份提供商Idp,將RP的網(wǎng)站標識符RPk及新生成的rp_nonce、u_nonce作為URI片段發(fā)送給用戶代理。JavaScript可以訪問這些URI片段,但不會發(fā)送到Idp后端。用戶代理將它們連接之后再進行盲化處理。
3)用戶代理被重定向到Idp來加載它的網(wǎng)站,但是這個請求并不包含任何查詢參數(shù)。此外,用戶代理還會將盲化后的消息M′轉(zhuǎn)發(fā)給Idp。如果有必要,那么用戶也需要登錄Idp。
4)Idp將其網(wǎng)站內(nèi)容發(fā)送給用戶代理,網(wǎng)站的內(nèi)容包括JavaScript代碼和Idp的公共驗證密鑰,隨后,用戶代理利用公共驗證密鑰執(zhí)行JavaScript代碼來驗證Idp的身份。如果此驗證成功,那么用戶代理就會為用戶打開一個對話框,以確認他希望登錄到相應的OpenID依賴方RP。
5)為了同意授權,用戶單擊對話框中的確認按鈕,然后向Idp發(fā)送對消息M′進行簽名的請求。
6)Idp收到來自用戶代理的請求之后,對消息M′進行簽名,并將簽名之后生成的值發(fā)送給用戶代理。
7)用戶代理收到簽名值之后對其進行解盲,完成解盲之后用戶代理就可以向OpenID依賴方RP發(fā)送登錄請求。
8)RP驗證盲簽名的正確性,并驗證網(wǎng)站的標識符RPk是否沒有發(fā)生變化,當所有驗證通過之后,RP向用戶代理發(fā)送登錄請求回應,通知用戶代理是否登錄成功。
在本節(jié)中,將本文提出的基于SM9盲簽名的OpenID協(xié)議先是從雙向認證性、抵抗假冒攻擊、重放攻擊3個方面進行理論分析,然后使用形式化分析工具Scyther對協(xié)議的安全性進行分析。
1)雙向認證。
雙向認證是協(xié)議所要具備的最基本的安全需求[25],本文提出的協(xié)議具備雙向認證性,分析如下:
在3.1節(jié)第3步中,用戶代理被重定向到身份提供商Idp來加載它的網(wǎng)站后,Idp將其網(wǎng)站內(nèi)容發(fā)送給用戶代理,網(wǎng)站內(nèi)容包括JavaScript代碼和Idp的公共驗證密鑰,隨后用戶代理需要利用公共驗證密鑰執(zhí)行JavaScript代碼來驗證Idp的身份。如果驗證成功,用戶代理才會為用戶打開一個對話框。在此之后,用戶代理會向Idp發(fā)送簽名請求,Idp使用自己的私鑰進行簽名相當于對消息進行了認證,只有當雙方的驗證都能通過之后,才會繼續(xù)執(zhí)行協(xié)議的流程,在3.1節(jié)第7、8步中,用戶代理得到消息M′的盲簽名后向OpenID依賴方RP發(fā)送登錄請求,隨后,RP驗證盲簽名的正確性,并驗證網(wǎng)站的標識符RPk是否沒有發(fā)生變化,當所有驗證通過之后,RP通知用戶代理是否登錄成功,用戶代理在收到RP登錄成功的消息之后,會對信息的真?zhèn)涡赃M行相關驗證,并最終執(zhí)行完協(xié)議的全部流程。所以本文提出的協(xié)議可提供雙向認證的安全需求。
2)假冒攻擊。
3)重放攻擊。
4)利用Scyther工具分析協(xié)議。
2008年,Creamers[26]提出了基于操作語義的協(xié)議自動化分析軟件Scyther1.0,并利用Scyther工具對很多的經(jīng)典密鑰建立協(xié)議進行了分析和驗證。Scyther工具是使用安全協(xié)議描述語言SPDL對協(xié)議角色進行編寫的,由于軟件過程定義語言SPDL是對過程建模的語言,所以可以很直觀地對照著所提出協(xié)議流程的每一步進行程序的編寫,SPDL語言還可以對協(xié)議流程中所有實體以及相關的屬性進行定義。
當用Scyther工具對本文的協(xié)議建模時,首先使用角色序列作為參數(shù),而后對發(fā)送事件和接收事件進行定義,如圖2所示,角色R代表的是用戶代理,角色S代表的是RP,角色T代表的是Idp。在使用Scyther對本文的協(xié)議過程進行階段性的考慮時,會逐步地去添加安全認證協(xié)議的機密性、同步性以及一致性,協(xié)議所有的角色分別使用Alive、Weakagree、Niagree、Nisynch進行安全聲明,并檢查生成和接受變量的安全性,隨后Scyther工具會對添加的相應屬性進行驗證。IDk指的是用戶的標識符,RPk則指的是RP的網(wǎng)站標識符,從圖中可看出2個標識符在協(xié)議流程中沒有被泄露。如果流程中存在攻擊,那么在Status(狀態(tài)欄)一列會顯示Fail;如果在協(xié)議的流程當中并不存在著攻擊,則會在Status一列顯示出OK,并且在Comments一列顯示No attacks within bounds(限制范圍內(nèi)沒有找到攻擊),這意味著在設置的最大運行次數(shù)的界限內(nèi)不存在攻擊,可以看出結果圖的狀態(tài)欄都顯示OK,由此證明了協(xié)議的安全性。
圖2 Scyther工具對協(xié)議的分析結果
從本文前文有關基于SM9盲簽名的OpenID協(xié)議描述可以知曉,協(xié)議的三方在交互的過程中都參與了計算和通信,產(chǎn)生了一定的計算量和通信量,所以可以針對協(xié)議不同階段中產(chǎn)生的計算量和通信量,對協(xié)議進行性能方面的分析。將本文的協(xié)議與Hammann等[11]中基于標準OpenID協(xié)議而做出改進的2個協(xié)議,即POIDC和pairwise POIDC進行對比分析,對比分析的結果見表1所示。
表1 不同協(xié)議之間性能分析對比
對表1中的符號解釋如下:Ta是按位運算的計算量;Tb是隨機數(shù)發(fā)生器產(chǎn)生隨機數(shù)的計算量;Tc是哈希函數(shù)的計算量。
表1還統(tǒng)計了本文提出的協(xié)議在整個交互流程中的通信量,其中符號τ代表協(xié)議中使用常量的平均比特位長度。需要注意,協(xié)議中除了產(chǎn)生的哈希值長度是2τ以外,其余符號或輸出結果長度均為τ。下面本文從RP與用戶代理之間、用戶代理與Idp之間分析通信時在信道中傳輸?shù)臄?shù)據(jù)長度。在RP與用戶代理進行交互過程中,包含了待盲化的消息M、解盲后的{h,m,w}、簽名請求、向RP發(fā)送的登錄請求以及登錄請求回應,整個交互過程當中總共需要9τ。在用戶代理與Idp進行交互過程中,包含了wT、M′、C1、C2、加載網(wǎng)站請求、JavaScript代碼、Idp的公共驗證密鑰,其中的M′=(α,β,γ),輸出結果長度為3τ,所以整個交互過程當中總共需要9τ。綜上所述本文的協(xié)議通信量大小為18τ。
通過本節(jié)的分析, 可以發(fā)現(xiàn)由于本文提出的協(xié)議是基于SM9盲簽名的,所以相較于其他2個對比協(xié)議,總體的計算量方面略少于其他2個對比協(xié)議, 并且因為在協(xié)議的流程中取消了令牌的使用,使得整個協(xié)議的交互流程不需要令牌的傳送與接收,所以在通信量方面明顯少于其他2個對比協(xié)議。
本文提出了一種基于SM9盲簽名的OpenID協(xié)議,該協(xié)議是基于身份基盲簽名的,不僅優(yōu)化了OpenID協(xié)議的交互流程,同時實現(xiàn)了隱私保護。在協(xié)議交互的過程當中,避免了由于令牌的使用所造成的計算量和通信量方面的額外開銷,在保證了OpenID協(xié)議安全性的同時,協(xié)議效率也得到了提升,通過仿真實驗和理論分析說明了整個協(xié)議具有推廣使用的前景。