徐濤++文福安
摘要:本文分析了在線考試系統(tǒng)存在的安全問(wèn)題,結(jié)合PKI體系和數(shù)字證書,為自主開發(fā)的在線考試系統(tǒng)設(shè)計(jì)了一個(gè)基于硬件USBKey的考試系統(tǒng)數(shù)據(jù)安全傳輸?shù)慕鉀Q方案,并進(jìn)行了實(shí)現(xiàn),解決了開發(fā)過(guò)程中遇到的一些關(guān)鍵問(wèn)題,尤其是C/C++和Java之間跨語(yǔ)言的相互加密和解密的通信問(wèn)題。
關(guān)鍵詞:考試系統(tǒng);USBkey;數(shù)據(jù)安全;PKI體系;PKCS#II
中圖分類號(hào):TP311
文獻(xiàn)標(biāo)識(shí)碼:A
DOI: 10.3969/j.issn.1003-6970.2016.01.002
0 引言
隨著Internet的快熟發(fā)展與普及,基于web的考試系統(tǒng)越來(lái)越受到歡迎,與傳統(tǒng)考試相比,在線考試系統(tǒng)是傳統(tǒng)考試的延伸,有其獨(dú)特的優(yōu)點(diǎn)。它可以充分利用計(jì)算機(jī)網(wǎng)絡(luò)的無(wú)限廣闊空間,沒(méi)有時(shí)間和地域限制,可以隨時(shí)隨地進(jìn)行考試,交互功能遠(yuǎn)強(qiáng)于傳統(tǒng)紙質(zhì),系統(tǒng)發(fā)布和版本升級(jí)方便,資源共享,信息豐富,便于實(shí)施統(tǒng)一的訓(xùn)練管理,大大簡(jiǎn)化了傳統(tǒng)考試的過(guò)程,部署成本低,實(shí)時(shí)性強(qiáng),有效地克服了傳統(tǒng)紙質(zhì)考試的缺點(diǎn),具有高效、靈活、便捷等特點(diǎn)。但是基于web的在線考試系統(tǒng)是以Internet為傳輸媒介的,考試系統(tǒng)中的題庫(kù)、試卷、需提交的答案、管理指令等都要經(jīng)過(guò)網(wǎng)絡(luò)進(jìn)行傳輸,而Internet卻是一個(gè)開放的、松散的和易受攻擊不安全的網(wǎng)絡(luò)環(huán)境,這對(duì)在考試系統(tǒng)中,上述需要經(jīng)過(guò)網(wǎng)絡(luò)進(jìn)行傳輸?shù)母鞣N數(shù)據(jù)的安全構(gòu)成了很大的威脅。本文針對(duì)這個(gè)問(wèn)題進(jìn)行了研究,為自主開發(fā)的考試系統(tǒng)設(shè)計(jì)了一套基于硬件USBKey的考試系統(tǒng)數(shù)據(jù)安全傳輸?shù)慕鉀Q方案,并進(jìn)行了實(shí)現(xiàn),解決了開發(fā)中遇到的一些關(guān)鍵問(wèn)題,尤其是C/C++和java互相通信加解密的問(wèn)題。
1 USBKey簡(jiǎn)介
USBKey(智能密碼鑰匙)是新一代身份認(rèn)證產(chǎn)品,它結(jié)合了智能卡技術(shù)、現(xiàn)代密碼學(xué)技術(shù)和USB接口技術(shù)。外形酷似U盤,具有唯一性和不可復(fù)制性;內(nèi)置微型智能卡處理器,采用1024位或更高位的非對(duì)稱密鑰算法對(duì)網(wǎng)上數(shù)據(jù)進(jìn)行加密、解密和數(shù)字簽名認(rèn)證,確保網(wǎng)上信息傳輸?shù)谋C苄?、真?shí)性、完整性和不可否認(rèn)性。是目前各大銀行給用戶采用的最高級(jí)別的安全工具。
每個(gè)USBKey都具備硬件PIN碼保護(hù),用戶能夠正常使用USBKey的兩個(gè)必要因素就是硬件本身和PIN碼。只有同時(shí)取得了USBKey和用戶的PIN碼,才能夠登錄系統(tǒng)。所以,即使用戶的PIN碼和USBKey其中之一被盜或丟失,也無(wú)法獲得合法認(rèn)證。
USBKey內(nèi)部有一定的存儲(chǔ)空間,可以存儲(chǔ)用戶的私鑰、會(huì)話秘鑰以及數(shù)字證書等機(jī)密數(shù)據(jù),對(duì)該存儲(chǔ)空間的讀寫操作必須要通過(guò)USBKey內(nèi)的程序?qū)崿F(xiàn),用戶無(wú)法直接讀取數(shù)據(jù),這就大大保證了用戶私鑰的安全性。并且,利用USBKey內(nèi)置的CSP (CryptographicService Provider,加密服務(wù)供應(yīng)器)模塊中的公鑰算法可以實(shí)現(xiàn)對(duì)用戶身份的認(rèn)證以及秘鑰的安全傳遞,所有的加解密運(yùn)算都只能在USBKey內(nèi)部進(jìn)行,這也就杜絕了用戶的私密信息被黑客截取的可能性。
USBKey制造商將USBkey和PKI技術(shù)結(jié)合起來(lái),利用USBkKey來(lái)保存數(shù)字證書和用戶私鑰。USBKey一般都提供了PKCS#II和CSP for Microsoft Cryp-toAPI兩種主流的應(yīng)用接口,這兩個(gè)接口分別遵循RSA公司開發(fā)的PKCS#11標(biāo)準(zhǔn)和微軟公司制定的MSCryptoAPI接口標(biāo)準(zhǔn)。本次研究就是將供銀行客戶端使用的硬件USBKey移植到考試系統(tǒng)中,根據(jù)所開發(fā)的考試系統(tǒng)的特點(diǎn),設(shè)計(jì)一套考試系統(tǒng)數(shù)據(jù)安全傳輸?shù)臋C(jī)制并實(shí)現(xiàn),以此來(lái)提供銀行級(jí)別的數(shù)據(jù)傳輸?shù)陌踩U霞吧矸菡J(rèn)證。
2 加密算法與PKI體系
2.1 密碼學(xué)基礎(chǔ)
數(shù)據(jù)加密的基本過(guò)程就是對(duì)原來(lái)為明文的文件或數(shù)據(jù)按某種算法進(jìn)行處理,使其成為不可讀的一段代碼,通常稱為“密文”,使其只能在輸入相應(yīng)的密鑰之后才能顯示出本來(lái)內(nèi)容,通過(guò)這樣的途徑來(lái)達(dá)到保護(hù)數(shù)據(jù)不被非法人竊取、閱讀的目的。該過(guò)程的逆過(guò)程為解密,即將該編碼信息轉(zhuǎn)化為其原來(lái)數(shù)據(jù)的過(guò)程。
根據(jù)密鑰類型的不同,可以將現(xiàn)代密碼技術(shù)分為兩類:對(duì)稱加密技術(shù)(秘密鑰匙加密)和非對(duì)稱加密技術(shù)(公開密鑰加密)。
2.1.1 對(duì)稱加密技術(shù)
對(duì)稱密碼體制又稱單鑰或私鑰(Privare-key),是從傳統(tǒng)密碼學(xué)中的簡(jiǎn)單移位、代替發(fā)展而來(lái)的。對(duì)稱密碼體制的特點(diǎn)是加密和解密采用相同的密鑰,即加密方利用一個(gè)秘鑰對(duì)數(shù)據(jù)進(jìn)行加密,解密方接收到數(shù)據(jù)后需要使用同一秘鑰進(jìn)行解密。因此在通信過(guò)程中,通信雙方需要使用安全信道來(lái)傳輸并保存他們的公共密鑰。對(duì)稱秘鑰體制的安全性嚴(yán)重依賴于公共秘鑰的安全性。這種加密技術(shù)的優(yōu)點(diǎn)是算術(shù)運(yùn)算量小,對(duì)機(jī)器要求較低,加解密速度快。然而其公共秘鑰的安全交換卻成了個(gè)嚴(yán)重問(wèn)題,一但通信過(guò)程中公共秘鑰泄露,那么通信的安全性便無(wú)法保證。
目前,廣泛使用的對(duì)稱加密算法主要有:DES、3DES、高級(jí)加密標(biāo)準(zhǔn)AES等,其中AES算法是用來(lái)替代經(jīng)典算法DES的。AES算法基于排列和置換運(yùn)算,排列是對(duì)數(shù)據(jù)重新進(jìn)行安排,置換是將一個(gè)數(shù)據(jù)單元替換為另一個(gè)。AES是一個(gè)迭代的、對(duì)稱密鑰分組的密碼,它可以使用128、192和256位密鑰,并且用128位(16字節(jié))分組加密和解密數(shù)據(jù)。
2.1.2 非對(duì)稱加密技術(shù)
非對(duì)稱加密算法又叫公開秘鑰加密算法或雙秘鑰加密算法。它需要兩個(gè)密鑰:公開密鑰和私有密鑰。公開密鑰和私有密鑰組成一個(gè)密鑰對(duì),如果用公開密鑰進(jìn)行加密,那么只有用對(duì)應(yīng)的私有密鑰才能解密;如果用私有密鑰進(jìn)行加密,那么只有用對(duì)應(yīng)的公開密鑰才能解密。公開密鑰體制最大的優(yōu)點(diǎn)就是不需要對(duì)通信中密鑰進(jìn)行加密傳輸,公開密鑰可以明文傳輸,這樣就省去了一條開銷很大的密鑰傳遞信道。但是,公開秘鑰體制有一個(gè)很大的缺陷,那就是其加密和解密的運(yùn)算時(shí)間比較長(zhǎng),時(shí)間一般是對(duì)稱加密體制的100倍以上。因此,這在一定程度上限制了它的應(yīng)用領(lǐng)域。
目前使用比較多的公認(rèn)安全的算法就是RSA算法了,RSA算法是基于大數(shù)分解難題的一種算法,目前沒(méi)有好的方法去攻破RSA算法,暴力破解需要花費(fèi)太長(zhǎng)的時(shí)間,基本不可能破解。
2.2 PKI體系
為解決Intemet的安全問(wèn)題,世界各國(guó)對(duì)其進(jìn)行了多年的研究,初步形成了一套完整的Internet安全解決方案,即目前被廣泛采用的PKI技術(shù)(Public KeyInfrastructure-公鑰基礎(chǔ)設(shè)施),PKI(公鑰基礎(chǔ)設(shè)施)技術(shù)采用證書管理公鑰,通過(guò)第三方的可信任機(jī)構(gòu)一認(rèn)證中心CA (Certificate Authority),把用戶的公鑰和用戶的其它標(biāo)識(shí)信息(如名稱、e-mail、身份證號(hào)等)捆綁在一起,在Internet上驗(yàn)證用戶的身份。目前,通用的辦法是采用建立在PKI基礎(chǔ)之上的數(shù)字證書,通過(guò)把要傳輸?shù)臄?shù)字信息進(jìn)行加密和簽名,保證信息傳輸?shù)臋C(jī)密性、真實(shí)性、完整性和不可否認(rèn)性從而保證信息的安全傳輸。
PKI系統(tǒng)主要由認(rèn)證機(jī)構(gòu)(CA)、注冊(cè)機(jī)構(gòu)(RA)、證書管理機(jī)構(gòu)、實(shí)體等部分組成。CA是PKI體系的核心,負(fù)責(zé)證書的頒發(fā)和合法性管理;RA是CA與用戶的良好隔離機(jī)構(gòu),使得用戶不直接與CA接觸,向RA申請(qǐng)注冊(cè)證書,RA驗(yàn)證用戶申請(qǐng)后,生成標(biāo)示符轉(zhuǎn)達(dá)給CA生成證書;證書管理系統(tǒng)負(fù)責(zé)證書的發(fā)布和撤銷;實(shí)體是PKI證書的使用者
3 考試系統(tǒng)安全設(shè)計(jì)
為解決在線考試系統(tǒng)的安全問(wèn)題,引人PKI安全體系,在PKI基礎(chǔ)之上以數(shù)字證書的形式解決了公鑰信息的存儲(chǔ)表示問(wèn)題,通過(guò)把要傳輸?shù)臄?shù)字信息進(jìn)行加密和簽名,保證信息傳輸?shù)臋C(jī)密性、真實(shí)性、完整性和不可否認(rèn)性。同時(shí)使用硬件USBKey,通過(guò)該USBKey中的存儲(chǔ)空間存儲(chǔ)用戶的私鑰、會(huì)話秘鑰以及數(shù)字證書等機(jī)密數(shù)據(jù),并通過(guò)該硬件保證用戶的私鑰不可導(dǎo)出,這樣以來(lái)就又充分保證了私鑰等機(jī)密信息的安全性。用戶只能通過(guò)USBKey內(nèi)部的CSP模塊訪問(wèn)私密數(shù)據(jù),提供了銀行級(jí)別的安全性。
由于USBkey具有極高的安全性,能夠很好的滿足考試系統(tǒng)對(duì)安全性的要求。因此,考試系統(tǒng)的數(shù)據(jù)安全通信流程架構(gòu)設(shè)計(jì)如圖1所示。服務(wù)器端設(shè)有服務(wù)模塊和加解密模塊,考生機(jī)客戶端由瀏覽器和USBKey組成,而瀏覽器通過(guò)插件Plugin訪問(wèn)USBKey。
上圖結(jié)構(gòu)中分為考生機(jī)客戶端和服務(wù)器兩個(gè)部分。在客戶端部分,瀏覽器通過(guò)plugin調(diào)用插件,plugin采用C/C++語(yǔ)言開發(fā),封裝了USBkey提供的加解密算法C語(yǔ)言接口,并向?yàn)g覽器提供用于RSA加解密的JavaScript接口;在java服務(wù)器端部分,采用軟加解密方式,調(diào)用編寫的CSP加解密算法模塊完成所需功能。
客戶端網(wǎng)頁(yè)和java服務(wù)器端通過(guò)RSA驗(yàn)證用戶身份并傳輸數(shù)據(jù)的通信流程如下:
i.客戶端網(wǎng)頁(yè)通過(guò)確認(rèn)按鈕,將頁(yè)面信息A(用戶名、密碼等)發(fā)送給服務(wù)器;
ii.服務(wù)器收到信息A后,將:信息A+當(dāng)前系統(tǒng)時(shí)間+隨機(jī)碼序列(為了防止重放攻擊) 形成的數(shù)據(jù)B保存在服務(wù)器上,并通過(guò)服務(wù)器的加密函數(shù)將上述信息以客戶公鑰加密的方式加密成數(shù)據(jù)C發(fā)送給客戶端頁(yè)面;
m.客戶端收到該加密數(shù)據(jù)C后,用自己的私鑰解密,再用服務(wù)器公鑰加密后,形成數(shù)據(jù)D發(fā)還給服務(wù)器;
IV服務(wù)器收到數(shù)據(jù)D后,用自己的私鑰解密,并與服務(wù)器上原先保存的數(shù)據(jù)B進(jìn)行比對(duì),若完全一致,則服務(wù)器認(rèn)為請(qǐng)求者是合法用戶,允許用戶的登錄操作。并通過(guò)該方式獲取對(duì)稱加密算法AES的會(huì)話秘鑰。
4 研究中遇到的技術(shù)難點(diǎn)及解決方案
4.1 公鑰導(dǎo)入問(wèn)題
由于USBKey內(nèi)部有一定的存儲(chǔ)空間,用來(lái)存儲(chǔ)用戶的私鑰、會(huì)話秘鑰以及數(shù)字證書等機(jī)密數(shù)據(jù),而對(duì)該存儲(chǔ)空間的讀寫操作必須要通過(guò)USBKey內(nèi)的CSP (Cryptographic Service Provider)模塊實(shí)現(xiàn),用戶無(wú)法直接讀取數(shù)據(jù)。因此只有把服務(wù)器的公鑰導(dǎo)入到USBKey中才能讓CSP去訪問(wèn)該公鑰,完成RSA加密。經(jīng)研究發(fā)現(xiàn)USBkey提供的PKCS11接口中的C_CreateObject()函數(shù)能夠?qū)⒎庋b好的公鑰導(dǎo)入到USBKey中。C_CreateObject()的函數(shù)定義如下:
C_CreateObj ect創(chuàng)建了一個(gè)新的對(duì)象。hSession是對(duì)話的句柄;pTemplate指向?qū)ο蟮哪0?;uICount是模板中的屬性數(shù);phObject指向接收新對(duì)象句柄的單元。
在使用該函數(shù)前,需要先定義公鑰模板并對(duì)其中的參數(shù)賦值.然后才能導(dǎo)入。模板定義方式如下:
CK—ATTRIBUTE pubTemplate[]=
{
{ CKA_CLASS, &pubClass, sizeof (pubClass)),
{CKA_ KEY_7IYPE ,
&keyType ,
sizeof(keyType)},
{CKA_SUBJECT, subject. sizeof (subject)),
{ CKA_MODULUS_BITS, &uIModulusBits,sizeof (uIModulusBits)},
{ CKA_MODULUS, modulus, sizeof (modulus)},
{ CKA_PUBLIC_ EXPONENT, exponent, sizeof(exponent)},
{CKA_ENCRYPT, &bTrue, sizeof (bTrue)},
{ CKA_TOKEN, &bTrue, sizeof (bTrue)},
{ CKA- WRAP, &bTrue, sizeof (bTrue)},
);
4.2 C++和java加解密通信問(wèn)題
考生機(jī)客戶端和java服務(wù)器端進(jìn)行雙向加密和解密的通信過(guò)程中,C/C++加密后的數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳輸?shù)絡(luò)ava服務(wù)器端進(jìn)行解密時(shí)失敗,報(bào)出bad_key的錯(cuò)誤;同時(shí)java服務(wù)器端加密的數(shù)據(jù)經(jīng)由網(wǎng)絡(luò)傳送到C/C++客戶端解密時(shí),也是失敗,同樣報(bào)出bad_key的錯(cuò)誤。針對(duì)這個(gè)問(wèn)題,研究發(fā)現(xiàn),這與計(jì)算機(jī)體系中的字節(jié)序Big-Endian和Little-Endian有關(guān)。
4.2.1 大端模式與小端模式
在各種計(jì)算機(jī)體系結(jié)構(gòu)中,對(duì)于字節(jié)、字、基本數(shù)據(jù)類型等的存儲(chǔ)機(jī)制有所不同,因而引發(fā)了計(jì)算機(jī)通信領(lǐng)域中一個(gè)很重要的問(wèn)題,即通信雙方交流的信息單元(比特、字節(jié)、字、雙字等等)應(yīng)該以什么樣的順序進(jìn)行傳送。如果達(dá)不成一致的傳送順序規(guī)則,通信雙方將無(wú)法進(jìn)行正確的編/譯碼從而導(dǎo)致雙方通信失敗。
現(xiàn)代的計(jì)算機(jī)系統(tǒng)一般采用字節(jié)(8 bit Byte)作為邏輯尋址單位。每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit。然而在C/C++語(yǔ)言中除了8bit的char之外,還有16bit的wchar t型和short類型,32bit的Int及l(fā)ong類型,64位的double及l(fā)ong long類型(編譯器不同,基本數(shù)據(jù)類型所占的長(zhǎng)度也可能不同,具體情況需根據(jù)編譯器自身的實(shí)現(xiàn))。另外,對(duì)于位數(shù)大于8位的處理器,例如16位、32位或者64位的處理器,由于寄存器寬度大于一個(gè)字節(jié)(8 bit),那么必然存在著如何安排多個(gè)字節(jié)數(shù)據(jù)存儲(chǔ)順序(Byte Order)的問(wèn)題。常見的字節(jié)存儲(chǔ)順序有兩種:Big Endian(High-byte first)和Little Endian (Low-byte first). IntelX86平臺(tái)采用Little Endian,而PowerPC處理器則采用了Big Endian。另外,對(duì)于大小端的處理也和編譯器的具體實(shí)現(xiàn)有關(guān)。
(1) Little-Endian,即小端存儲(chǔ)模式。就是指數(shù)據(jù)的高位字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中。C/C++語(yǔ)言采用的存儲(chǔ)模式就是Little-Endian,比如有一個(gè)雙字節(jié)變量shortA-OX1234,那么A所代表的變量的第一個(gè)字節(jié)存儲(chǔ)的是OX34,第二個(gè)字節(jié)存數(shù)的是OX12.
(2) Big-Endian,即大端存儲(chǔ)模式。就是指數(shù)據(jù)的高位字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中,這種存儲(chǔ)模式有點(diǎn)兒類似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向大增加,而數(shù)據(jù)從高位往低位放。Java語(yǔ)言采用存儲(chǔ)模式是Big-Endian。比如在Java中有一個(gè)雙字節(jié)變量shortA-OX1234,那么A所代表的變量的第一個(gè)字節(jié)存儲(chǔ)的是OX12,第二個(gè)字節(jié)存數(shù)的是OX34;與C/C++語(yǔ)言中的正好相反。
另外在網(wǎng)絡(luò)字節(jié)序中:TCP/IP各層協(xié)議將字節(jié)序順序定義為Big-Endian,因此TCP/IP協(xié)議中使用的字節(jié)序通常稱之為網(wǎng)絡(luò)字節(jié)序。故而網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)為Big-Endian類型。
由以上字節(jié)序的介紹可知,一個(gè)C/C++中的UTF-16編碼的字母或者多余一個(gè)字節(jié)的基本數(shù)據(jù)類型(short類型,int類型,double類型等),傳輸?shù)絁ava語(yǔ)言中,要轉(zhuǎn)換成java語(yǔ)言的Big-Endian位表示形式(逆序順序交換高低位字節(jié)),才能正確譯碼,反之亦然。
而RSA算法對(duì)數(shù)據(jù)的加密和解密算法均是基于大數(shù)質(zhì)數(shù)分解的,比如一個(gè)1024位的公鑰的模數(shù)N,就是一個(gè)128字節(jié)大小的整數(shù)。其加密后的數(shù)據(jù)也是一個(gè)很大的整數(shù)。由于加密后的數(shù)據(jù)是一個(gè)大整數(shù),多于一個(gè)字節(jié),便也存在大小端表示問(wèn)題。因此在Java和C/C++中要對(duì)解密前的數(shù)據(jù)按字節(jié)進(jìn)行反轉(zhuǎn)后才能解密成功。
4.2.2 加解密算法的數(shù)據(jù)轉(zhuǎn)換流程
為了避免數(shù)據(jù)的多字節(jié)存儲(chǔ)問(wèn)題(如UTF-16編碼的雙字節(jié)字符,從C/C++語(yǔ)言與Java語(yǔ)言,就要進(jìn)行字節(jié)序的轉(zhuǎn)換),不管何種語(yǔ)言,均將要加密的明文字符串轉(zhuǎn)換為UTF-8字節(jié)流,然后進(jìn)行加密;解密完成時(shí),再進(jìn)行UTF-8解碼,最終形成正確的明文數(shù)據(jù)。這樣有兩個(gè)好處:
(l)可以避免UTF-16編碼字符帶來(lái)的大小端轉(zhuǎn)換問(wèn)題
(2)同時(shí)由于使用的數(shù)據(jù)大部分為英文字符,由UTF-16轉(zhuǎn)換為UTF-8,可以節(jié)省一個(gè)字節(jié)的存儲(chǔ)空間,這樣便可減小要加密的字節(jié)數(shù),加快加解密數(shù)據(jù)的速度。
因此,考生機(jī)客戶端(C/C++端)對(duì)數(shù)據(jù)RSA加密的數(shù)據(jù)轉(zhuǎn)換流程如圖2。首先,明文數(shù)據(jù)經(jīng)過(guò)UTF-8編碼,然后調(diào)用USBKey中CSP模塊完成數(shù)據(jù)的加密,得到的數(shù)據(jù)按照一個(gè)字節(jié)一個(gè)字節(jié)的逆序翻轉(zhuǎn),再經(jīng)過(guò)Base64編碼,方便在網(wǎng)絡(luò)上進(jìn)行傳輸,保證數(shù)據(jù)傳輸過(guò)程不會(huì)出現(xiàn)差錯(cuò)。上述流程中,加密完的數(shù)據(jù)進(jìn)行按字節(jié)逆序翻轉(zhuǎn),是因?yàn)镽SA加密運(yùn)算的結(jié)果也是一個(gè)大整數(shù),也存在大端存儲(chǔ)和小端存儲(chǔ)的問(wèn)題,進(jìn)行轉(zhuǎn)換后,方便JAVA服務(wù)器端進(jìn)行數(shù)據(jù)的解密。
Java端進(jìn)行解密時(shí)數(shù)據(jù)轉(zhuǎn)換流程如圖3。首先,收到的密文先經(jīng)過(guò)Base64解碼,然后調(diào)用服務(wù)器端CSP模塊解密,最后經(jīng)由UTF-8解碼,獲得最終的明文數(shù)據(jù)。
4.3 證書導(dǎo)出公鑰
在考生機(jī)客戶端和服務(wù)器通信的過(guò)程中,java服務(wù)器需要使用客戶端的公鑰加密數(shù)據(jù),因此需要獲得客戶端公鑰。而客戶端的公鑰存儲(chǔ)在USBKey中的數(shù)字證書里。因此就需要從USBKey的證書中導(dǎo)出公鑰參數(shù),即公鑰的模數(shù)N和指數(shù)E。然而由于RSA算法對(duì)數(shù)據(jù)的加密和解密算法均是基于大數(shù)質(zhì)數(shù)分解的,模數(shù)N和指數(shù)E也都是一個(gè)大整數(shù)(Biginterger),因此其也存在大端表示和小端表示。C/C++采用LittleEndian,而Java采用Big Endian,因此從客戶端證書中讀取到N和E后,需要將其按字節(jié)反轉(zhuǎn),轉(zhuǎn)換為java端大端存儲(chǔ)形式,才能得到正確的N和E,并用其進(jìn)行RSA加密。
5 結(jié)論
本文為了解決自主開發(fā)的在線考試系統(tǒng)的安全問(wèn)題,引人了PKI安全體系,在PKI基礎(chǔ)之上結(jié)合數(shù)字證書的形式解決了公鑰信息的存儲(chǔ)表示問(wèn)題,通過(guò)把要傳輸?shù)臄?shù)字信息進(jìn)行加密和簽名,保證信息傳輸?shù)臋C(jī)密性、真實(shí)性、完整性和不可否認(rèn)性。同時(shí)使用硬件USBKey的存儲(chǔ)空間存儲(chǔ)用戶的私鑰、會(huì)話秘鑰以及數(shù)字證書等機(jī)密數(shù)據(jù),并通過(guò)該硬件保證用戶的私鑰不可導(dǎo)出,這樣以來(lái)就又充分保證了私鑰等機(jī)密信息的安全性。通過(guò)這個(gè)設(shè)計(jì)方案,提供了銀行級(jí)別的安全保障。本人還對(duì)這個(gè)設(shè)計(jì)方案進(jìn)行了實(shí)現(xiàn),解決了遇到的一些關(guān)鍵問(wèn)題,尤其是C/C++和java跨語(yǔ)言的相互加密和解密的通信問(wèn)題。