張小波,陳軍勝,白曉明,張俊,石吉寶
(成都市勘察測繪研究院,四川成都 610081)
USBKEY是一種USB接口的硬件設備,具有唯一編號,它內置單片機或智能卡芯片,有一定的存儲空間,可用于存儲用戶的密鑰及數字證書,利用USBKEY內置的公鑰算法(如HMAC-MD5算法)可實現對用戶身份的認證。由于用戶密鑰保存在USBKEY中,理論上使用任何方式都無法讀取,因此保證了用戶認證的安全性。
USBKEY用于身份認證,首先需要進行USBKEY的注冊,在USBKEY中寫入用戶名信息,并在數據庫中記錄用戶名、USBKEY的序列號等。

圖1 USBKEY驗證過程
USBKEY的驗證過程如下:服務器端產生一個隨機數,將隨機數發送給客戶端,客戶端的USBKEY利用此隨機數和存儲的密鑰文件通過硬件加密引擎進行計算,得到運算結果并發送給服務器;服務器端根據用戶信息和隨機數用加密引擎進行計算,得到運算結果,與客戶端發送的結果進行比較,若結果一致則通過驗證。
下面是以北京飛天誠信的ePass1000ND制作的一個基于ASP.NET的網絡信息系統身份認證演示。
系統部署后,首先需要進行USBKEY注冊,在客戶機插入 USBKEY,輸入一個密鑰,然后點擊“USBKEY授權”,將密鑰加密處理后寫入USBKEY。
在USBKEY驗證時,需要輸入待驗證的密鑰,然后點擊“USBKEY驗證”,若用戶輸入的密鑰正確,則驗證成功,否則驗證失敗。

圖2 USBKEY注冊及驗證演示
客戶端讀寫USBKEY是利用USBKEY廠家提供的ACTIVEX控件進行的,需要在ASPX頁面的<body>段添加一個ACTIVEX對象,對象名為“epass”:

USBKEY的注冊需要在用戶數據庫中寫入用戶賬號密碼信息及用戶名與USBKEY對應關系,在USBKEY中寫入密鑰等,USBKEY寫入密鑰的核心代碼如下:

USBKEY驗證的實質是驗證服務器端存儲的密鑰與USBKEY中存儲的密鑰是否一致,為安全起見,在驗證時并不是直接用密鑰進行比對,而是分別將密鑰與一組隨機數進行不可逆的哈希運算,比較哈希運算的結果是否一致即可。USBKEY驗證需要服務器與客戶端交互,服務器端生成隨機數,利用隨機數和密鑰進行哈希運算,得到結果1;客戶端的USBKEY利用此隨機數和內部存儲的密鑰進行哈希運算,得到結果2;服務器端將結果1和結果2進行對比,若一致則驗證成果,否則失敗。
(1)生成隨機數


(3)服務器端哈希運算及驗證

以上是USBKEY用于網絡信息系統身份認證的最簡演示,在實際運用時,可以采取以下一些方法,進一步提高網絡系統身份認證的安全性:
(1)用戶名與USBKEY的序列號綁定:由于每個USBKEY都有一個不可更改的唯一序列號,因此實際上是將用戶名與USBKEY硬件綁定了,用戶只要保管好自己的USBKEY就可以防止他人以本人身份登錄;
(2)寫入USBKEY的密鑰二次加密:一般以用戶名或密碼作為密鑰,經加密后寫入USBKEY。雖然密鑰文件在USBKEY中對用戶是不可見的,但是由于用戶名或者密碼本身仍然有泄露風險,因此可以自定義特定算法,對密鑰進行二次加密后再寫入USBKEY,這樣即使非法用戶盜取了用戶名、密碼仍然無法復制USBKEY;
(3)啟用USBKEY自身的權限系統:在寫入密鑰散列計算后得到的兩個文件時,可以對這兩個文件的權限設置為需要用戶PIN碼驗證,由于用戶PIN碼是USBKEY的使用者自行設置的,只與USBKEY硬件有關,與身份認證系統無關,且PIN碼累計輸錯一定次數后USBKEY將會自動鎖定無法使用,采用此種方法可以顯著提高安全性。
[1]周廣輝.USBKEY用戶認證平臺的研究和實現[J].信息安全與通信保密,2009(9):113~118.
[2]馬偉強.我國網上銀行身份認證技術分析[J].計算機安全,2012(3):50~52.
[3]北京飛天誠信科技有限公司.ePass1000ND開發文檔[R].