根據「私鑰永遠不出KEY」的定律,在實際密碼應用中基本上都是使用硬體設備作為私鑰證書的載體。今天介紹一下主流的幾種安全設備和應用結合模式。
USB Key
USB Key的中文大名是智能密碼鑰匙,它是一種USB接口的硬體設備,內置晶片,有一定的存儲空間,可以存儲證書和私鑰。凡是使用私鑰進行的運算,都是在USB Key中完成。USB Key可隨身攜帶,在需要使用時才接入電腦,進一步降低了私鑰外洩的風險。再加上通用性強,價格親民(硬體價格一般在幾十元左右),因此是使用最為廣泛的密碼安全工具之一。USB Key最常見的應用場景就是網銀了,前幾年幾大銀行採購的USB Key數量是以億計的,有設備廠商就是因此而上市。
雖然從外觀上看,USB Key和U盤沒有什麼區別。但其實兩者有本質的不同。從技術上講,你可以把USB Key看成一種小型的專用的計算機,它有自己的CPU、存儲和作業系統。USB Key的CPU一般相當於計算機上的8位CPU,存儲在64K-256K左右,作業系統就是COS(Chip Operating System晶片作業系統),硬體內置算法。USB Key的存儲主要用來存放證書和私鑰,也可以存放一些重要的用戶數據。有些USB Key產品還採用FLASH存儲晶片(既然經常被人當作U盤,那我就向U盤看齊),存儲空間可以做到幾個G。不過出於安全考慮,證書和私鑰一般不會放在FLASH存儲空間,另外,FLASH存儲的發熱會影響CPU晶片的運算。所以這種產品沒有成為市場上的主流。
用到USB Key的地方主要是數字籤名和私鑰解密。在需要數字籤名時,業務系統將明文送到USB Key內部,由USB Key中的私鑰對明文的摘要值進行加密;在需要解密時,業務系統將密文送到USB Key內部,由USB Key中的私鑰對密文進行解密。由於USB Key的私鑰還有口令保護,所以在界面上會彈出對話框,要求用戶輸入口令。用戶輸入正確口令後,USB Key的硬體使用私鑰完成運算,並將結果返回給業務系統。流程如下圖。
上述流程看起來沒什麼問題,事實上USB Key也一直這樣用著。但就像前面說的,密碼需要正確使用以及完善的體系才能發揮的安全作用。而在上面的流程裡,USB Key內部沒有問題,但業務系統和USB Key的交互過程是有漏洞存在的。以數字籤名為例,攻擊者首先可以篡改業務系統向USB Key傳遞的明文,造成被USB Key實際籤名的數據和用戶認為被籤名的數據不一致。比如在網銀系統裡,用戶在頁面上選擇轉帳1000元,而攻擊者將金額篡改成10000元再發給USB Key籤名。網銀系統得到籤名結果並驗證通過後,會按照10000元進行轉帳。其次,由於籤名時用戶是在計算機上的業務系統中輸入口令,因此存在口令被截獲的風險,過程請見下圖。
針對第一個漏洞,可以在USB Key設備上增加一塊顯示屏,顯示被籤名的明文,用戶在籤名前再確認。比如在網銀系統裡,用戶就可以確認USB Key收到的轉帳金額和頁面上選擇的轉帳金額是否一致。針對輸入口令的被截獲的漏洞,可以在USB Key上安裝物理按鍵,實現口令在設備上的直接輸入,而不再經過計算機。改造後流程如下。
事實上,上述USB Key的漏洞最早就是在網銀應用中被發現的。後來各大銀行紛紛推出的二代、三代網銀設備,就是對原來的USB Key的改造升級。大家有興趣可以對比一下自己使用的網銀USB Key,看看有什麼變化。而在非網銀領域,出於成本考慮,基本還是使用普通的USB Key設備。
從開發的角度講,如果USB Key存儲的是RSA證書,那應用系統可基於CryptoAPI/CSP體系實現設備完全透明,也就是說應用系統不需要調用USB Key的任何接口,甚至不需要知道有沒有USB Key,只需通過標準的CryptoAPI接口,就可以使用Key中的私鑰和證書,這一點在前面已經介紹過。如果應用系統使用的是裝有國密算法證書的USB Key,則無法使用CryptoAPI/CSP體系,而需要調用標準的國密庫接口。不過現在支持國密算法的USB Key都支持標準的國密庫接口,也就是說應用系統只要開發一次,也可以使用多種國密算法USB Key。當然,由於Windows的CSP體系不支持國密算法,應用系統還必須指明要使用的是哪一種或幾種USB Key,做不到完全透明。
另外,如果想使用USB Key存取重要的業務數據,情況就反過來了:對於支持國密算法證書的USB Key,國密庫接口裡包括讀寫數據的標準接口,對接一次即可;但如果是使用RSA算法證書的USB Key,由於CryptoAPI/CSP體系不包括數據讀寫,應用系統只能調用設備的原生接口,而且由於接口不同,每種設備都要對接開發一次。