左志斌
(鄭州市惠濟區委辦公室,河南 鄭州 450044)
隨著互聯網的不斷發展,越來越多的人開始嘗試在線交易。然而病毒、黑客、網絡釣魚以及網頁仿冒詐騙等惡意威脅,給在線交易的安全性帶來了極大的挑戰。調查顯示,去年美國由于網絡詐騙事件,使得銀行和消費者遭受的直接損失總計達24億美元,平均每位受害者損失約1200美元。層出不窮的網絡犯罪,引起了人們對網絡安全的關注,如何構建一種安全的通信系統成為目前迫切需要解決的問題。本文將介紹一種使用USBKey實現的基于數字證書的身份認證方案。該方案使用USBKey實現基于數字證書的客戶端與服務器端的身份相互認證,利用該身份認證方案,可以同時完成客戶端與服務器端雙方會話密鑰的分配。最后,文章對該身份認證方案的安全性和有效性進行了分析。
1.1 數字證書
數字證書又稱為數字標識(DigitalID),是標志網絡用戶身份信息的一系列數據。它提供了一種在Internet上身份驗證的方式,是用來標志和證明網絡通信雙方身份的數字信息文件。通俗地講,數字證書就是個人或單位在Internet上的身份證明。
數字證書是由CA中心簽發的,它本身就是用戶的身份和與之所持有的公鑰的結合。在結合之前,由一個可信任的認證機構(CA)來證實用戶的身份,然后由可信任的認證機構(CA)對該用戶身份及對應的公鑰相結合的證書進行數字簽名,用來證明證書的有效性。
一個數字證書的內容主要包括以下幾部分:①所有者的公鑰;②所有者的名字;③公鑰的失效期;④發放機構的名稱(發放數字證書的CA);⑤數字證書的序列號;⑥發放機構的數字簽名。
數字證書采用公鑰密碼體制中的RSA體制,每個數字證書都擁有一對互相匹配的密鑰,即私有密鑰(私鑰)和公共密鑰(公鑰)。其中,私鑰僅為用戶本人所掌握,主要用于解密和數字簽名;而公鑰可以對外公開,主要用于加密和驗證簽名。數字證書的加密過程是一個不可逆的過程,即利用公鑰加密后的數據只能通過相應的私鑰才能進行解密。因此,在發送數據時,只要發送方利用接收方的公鑰對要發送的數據進行加密,就可以確保數據的保密性,因為即使加密數據被第三方截獲,由于沒有相應的私鑰,第三方也無法進行解密。而第三方要破解出私鑰也是不現實的,即使在已知公鑰、明文、密文的條件下,要推導出目前使用的1024位RSA密鑰,也需要上千年的時間[1-2]。
1.2 USBKey
USBKey是一種USB接口的硬件設備。它內置單片機或智能卡芯片,有一定的存儲空間,可以存儲用戶的私鑰以及數字證書。由于用戶私鑰保存在USBKey的密碼鎖中,理論上使用任何方式都無法讀取,因此保證了身份認證中用戶私鑰的安全性。
每一個USBKey都具有硬件PIN碼保護,PIN碼和硬件構成了用戶使用USBKey的兩個必要因素,即所謂“雙因子認證”。用戶只有同時取得了USBKey和用戶PIN碼,才可以登錄系統。即使用戶的PIN碼被泄漏,只要用戶持有的USBKey不被盜取,合法用戶的身份就不會被仿冒;而如果用戶的USBKey遺失,拾到者由于不知道用戶PIN碼,也無法仿冒合法用戶的身份[3]。
USBKey具有安全數據存儲空間,可以存儲數字證書、密鑰等秘密數據,對該存儲空間的讀寫操作必須通過程序實現,用戶無法直接讀取,其中用戶密鑰是不可導出的,杜絕了復制用戶數字證書或身份信息的可能性。
USBKey內置CPU,可以實現加解密和簽名的各種算法,加解密運算在USBKey內進行,保證了密鑰不會出現在計算機內存中,從而杜絕了用戶密鑰被黑客截取的可能性[4]。
2.1 設計思想
該身份認證方案的設計思想如下:在雙方進行數據通信前,通信雙方相互認證對方的身份。首先,客戶端使用自己的證書私鑰對隨機數進行簽名發送給服務器端,服務器端驗證簽名來實現對客戶端的身份認證。之后,服務器端使用自己的證書私鑰對自己產生的隨機數、客戶端發送過來的隨機數進行簽名后發送給客戶端,客戶端通過驗證簽名來實現對服務器端的身份認證。最后,客戶端將接收到的服務器端隨機數進行簽名后發送回服務器端,服務器端通過比較該隨機數是否是自己發送的隨機數來實現身份認證過程中的抗重放攻擊[5]。
2.2 身份認證過程
過程1:實現服務器端對客戶端的身份認證;
①客戶端調用自己的USBKey產生非重復的隨機數r1;
②客戶端使用存儲在USBKey中的證書私鑰(Ka私)對{隨機數r1+服務器端身份}進行簽名獲得簽名信息Ma;
③客戶端將獲得的簽名信息Ma發送到服務器端;
④服務器端提取存儲的客戶端的證書公鑰(Ka公),使用該公鑰對簽名信息Ma進行驗證簽名同時檢驗服務器身份,驗證通過則證明該信息是由客戶端A發送的,該信息是完整的,未經篡改的;否則,拒絕該用戶;
過程2:實現客戶端對服務器端的身份認證;
⑤服務器端產生非重復的隨機數r2;
⑥服務器端使用自己的證書私鑰(Kb私)對{隨機數r1+隨機數r2+客戶端身份}進行簽名獲得簽名信息Mb;
⑦服務器將簽名信息Mb發送到客戶端;
⑧客戶端使用服務器端的證書公鑰(Kb公)驗證簽名信息Mb并驗證客戶端身份;驗證通過則證明了服務器端的身份,該信息是服務器端發送的,該信息是完整的,未經篡改的;
⑨客戶端比較自己產生的隨機數r1與接收的隨機數r1以證明該次會話是自己請求的應答;
過程3:實現身份認證過程中的抗重放攻擊。
⑩客戶端使用自己的證書私鑰(Ka私)對{隨機數r2}進行簽名獲得簽名信息Mc;
該次認證的目的是通過服務器端檢查發送的隨機數與接收的隨機數是否相同來證明是否有重放攻擊,在通信雙方無法建立時鐘同步的情況下,該方法可以很好地解決重放攻擊的發生。
身份認證過程流程圖如圖1所示。
3.1 在身份認證過程的開始,需要驗證客戶端用戶的PIN碼,該步驟保證了登錄用戶必須是USBKey的合法持有者,否則即使持有USBKey,由于不知道用戶PIN碼,也無法進行下一步操作;
3.2 基于該方案的身份認證過程,是利用公鑰密碼技術實現的,它的安全性從根本上取決于所使用私鑰的安全性。服務器端私鑰可以在服務器端由專業的人員通過相關的安全策略和手段來管理,而客戶端私鑰由于由用戶掌握,安全性成為薄弱環節。在該身份認證方案中,客戶端用戶私鑰是通過USBKey產生的,產生后即存放在USBKey中,用戶無法進行讀取。同時,客戶端用戶私鑰的使用,包括對傳輸信息的簽名和驗證簽名都是在USBKey中進行的,保證了用戶私鑰不會出現在計算機內存中,從而杜絕了用戶密鑰被黑客截取的可能性,保證了認證的安全性;

圖1 身份認證流程圖
3.3 為了使用USBKey實現證書私鑰的數據簽名、驗證簽名以及其他各種加解密操作,可以使用CryptoAPI的開發模式。CryptoAPI是微軟提供的一套Win32環境下加解密和簽名認證的編程接口,以供應用程序開發人員調用。通過調用這套函數接口,應用程序可以方便地操作USBKey來完成對數據的加解密和簽名驗證的功能;
3.4 在該方案中可以在身份認證的過程中,添加會話密鑰的傳輸,以實現通信中的密鑰分配功能。
[1]楊波.現代密碼學(第3版)[M].北京:清華大學出版社,2015.
[2]王育民,劉建偉.通信網的安全理論與技術[M].西安:西安電子科技大學出版社,2002.
[3]關振勝.公鑰基礎設施PKI及其應用[M].北京:電子工業出版社,2008.
[4]李濤.網絡安全概論[M].北京:電子工業出版社,2004.
[5]范紅,馮登國.安全協議理論與方法[M].北京:科學出版社,2003.