国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于USBKey的考試系統安全的設計與實現

2016-03-08 01:53徐濤文福安
軟件 2016年1期
關鍵詞:數據安全

徐濤++文福安

摘要:本文分析了在線考試系統存在的安全問題,結合PKI體系和數字證書,為自主開發(fā)的在線考試系統設計了一個基于硬件USBKey的考試系統數據安全傳輸的解決方案,并進行了實現,解決了開發(fā)過程中遇到的一些關鍵問題,尤其是C/C++和Java之間跨語言的相互加密和解密的通信問題。

關鍵詞:考試系統;USBkey;數據安全;PKI體系;PKCS#II

中圖分類號:TP311

文獻標識碼:A

DOI: 10.3969/j.issn.1003-6970.2016.01.002

0 引言

隨著Internet的快熟發(fā)展與普及,基于web的考試系統越來越受到歡迎,與傳統考試相比,在線考試系統是傳統考試的延伸,有其獨特的優(yōu)點。它可以充分利用計算機網絡的無限廣闊空間,沒有時間和地域限制,可以隨時隨地進行考試,交互功能遠強于傳統紙質,系統發(fā)布和版本升級方便,資源共享,信息豐富,便于實施統一的訓練管理,大大簡化了傳統考試的過程,部署成本低,實時性強,有效地克服了傳統紙質考試的缺點,具有高效、靈活、便捷等特點。但是基于web的在線考試系統是以Internet為傳輸媒介的,考試系統中的題庫、試卷、需提交的答案、管理指令等都要經過網絡進行傳輸,而Internet卻是一個開放的、松散的和易受攻擊不安全的網絡環(huán)境,這對在考試系統中,上述需要經過網絡進行傳輸的各種數據的安全構成了很大的威脅。本文針對這個問題進行了研究,為自主開發(fā)的考試系統設計了一套基于硬件USBKey的考試系統數據安全傳輸的解決方案,并進行了實現,解決了開發(fā)中遇到的一些關鍵問題,尤其是C/C++和java互相通信加解密的問題。

1 USBKey簡介

USBKey(智能密碼鑰匙)是新一代身份認證產品,它結合了智能卡技術、現代密碼學技術和USB接口技術。外形酷似U盤,具有唯一性和不可復制性;內置微型智能卡處理器,采用1024位或更高位的非對稱密鑰算法對網上數據進行加密、解密和數字簽名認證,確保網上信息傳輸的保密性、真實性、完整性和不可否認性。是目前各大銀行給用戶采用的最高級別的安全工具。

每個USBKey都具備硬件PIN碼保護,用戶能夠正常使用USBKey的兩個必要因素就是硬件本身和PIN碼。只有同時取得了USBKey和用戶的PIN碼,才能夠登錄系統。所以,即使用戶的PIN碼和USBKey其中之一被盜或丟失,也無法獲得合法認證。

USBKey內部有一定的存儲空間,可以存儲用戶的私鑰、會話秘鑰以及數字證書等機密數據,對該存儲空間的讀寫操作必須要通過USBKey內的程序實現,用戶無法直接讀取數據,這就大大保證了用戶私鑰的安全性。并且,利用USBKey內置的CSP (CryptographicService Provider,加密服務供應器)模塊中的公鑰算法可以實現對用戶身份的認證以及秘鑰的安全傳遞,所有的加解密運算都只能在USBKey內部進行,這也就杜絕了用戶的私密信息被黑客截取的可能性。

USBKey制造商將USBkey和PKI技術結合起來,利用USBkKey來保存數字證書和用戶私鑰。USBKey一般都提供了PKCS#II和CSP for Microsoft Cryp-toAPI兩種主流的應用接口,這兩個接口分別遵循RSA公司開發(fā)的PKCS#11標準和微軟公司制定的MSCryptoAPI接口標準。本次研究就是將供銀行客戶端使用的硬件USBKey移植到考試系統中,根據所開發(fā)的考試系統的特點,設計一套考試系統數據安全傳輸的機制并實現,以此來提供銀行級別的數據傳輸的安全保障及身份認證。

2 加密算法與PKI體系

2.1 密碼學基礎

數據加密的基本過程就是對原來為明文的文件或數據按某種算法進行處理,使其成為不可讀的一段代碼,通常稱為“密文”,使其只能在輸入相應的密鑰之后才能顯示出本來內容,通過這樣的途徑來達到保護數據不被非法人竊取、閱讀的目的。該過程的逆過程為解密,即將該編碼信息轉化為其原來數據的過程。

根據密鑰類型的不同,可以將現代密碼技術分為兩類:對稱加密技術(秘密鑰匙加密)和非對稱加密技術(公開密鑰加密)。

2.1.1 對稱加密技術

對稱密碼體制又稱單鑰或私鑰(Privare-key),是從傳統密碼學中的簡單移位、代替發(fā)展而來的。對稱密碼體制的特點是加密和解密采用相同的密鑰,即加密方利用一個秘鑰對數據進行加密,解密方接收到數據后需要使用同一秘鑰進行解密。因此在通信過程中,通信雙方需要使用安全信道來傳輸并保存他們的公共密鑰。對稱秘鑰體制的安全性嚴重依賴于公共秘鑰的安全性。這種加密技術的優(yōu)點是算術運算量小,對機器要求較低,加解密速度快。然而其公共秘鑰的安全交換卻成了個嚴重問題,一但通信過程中公共秘鑰泄露,那么通信的安全性便無法保證。

目前,廣泛使用的對稱加密算法主要有:DES、3DES、高級加密標準AES等,其中AES算法是用來替代經典算法DES的。AES算法基于排列和置換運算,排列是對數據重新進行安排,置換是將一個數據單元替換為另一個。AES是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192和256位密鑰,并且用128位(16字節(jié))分組加密和解密數據。

2.1.2 非對稱加密技術

非對稱加密算法又叫公開秘鑰加密算法或雙秘鑰加密算法。它需要兩個密鑰:公開密鑰和私有密鑰。公開密鑰和私有密鑰組成一個密鑰對,如果用公開密鑰進行加密,那么只有用對應的私有密鑰才能解密;如果用私有密鑰進行加密,那么只有用對應的公開密鑰才能解密。公開密鑰體制最大的優(yōu)點就是不需要對通信中密鑰進行加密傳輸,公開密鑰可以明文傳輸,這樣就省去了一條開銷很大的密鑰傳遞信道。但是,公開秘鑰體制有一個很大的缺陷,那就是其加密和解密的運算時間比較長,時間一般是對稱加密體制的100倍以上。因此,這在一定程度上限制了它的應用領域。

目前使用比較多的公認安全的算法就是RSA算法了,RSA算法是基于大數分解難題的一種算法,目前沒有好的方法去攻破RSA算法,暴力破解需要花費太長的時間,基本不可能破解。

2.2 PKI體系

為解決Intemet的安全問題,世界各國對其進行了多年的研究,初步形成了一套完整的Internet安全解決方案,即目前被廣泛采用的PKI技術(Public KeyInfrastructure-公鑰基礎設施),PKI(公鑰基礎設施)技術采用證書管理公鑰,通過第三方的可信任機構一認證中心CA (Certificate Authority),把用戶的公鑰和用戶的其它標識信息(如名稱、e-mail、身份證號等)捆綁在一起,在Internet上驗證用戶的身份。目前,通用的辦法是采用建立在PKI基礎之上的數字證書,通過把要傳輸的數字信息進行加密和簽名,保證信息傳輸的機密性、真實性、完整性和不可否認性從而保證信息的安全傳輸。

PKI系統主要由認證機構(CA)、注冊機構(RA)、證書管理機構、實體等部分組成。CA是PKI體系的核心,負責證書的頒發(fā)和合法性管理;RA是CA與用戶的良好隔離機構,使得用戶不直接與CA接觸,向RA申請注冊證書,RA驗證用戶申請后,生成標示符轉達給CA生成證書;證書管理系統負責證書的發(fā)布和撤銷;實體是PKI證書的使用者

3 考試系統安全設計

為解決在線考試系統的安全問題,引人PKI安全體系,在PKI基礎之上以數字證書的形式解決了公鑰信息的存儲表示問題,通過把要傳輸的數字信息進行加密和簽名,保證信息傳輸的機密性、真實性、完整性和不可否認性。同時使用硬件USBKey,通過該USBKey中的存儲空間存儲用戶的私鑰、會話秘鑰以及數字證書等機密數據,并通過該硬件保證用戶的私鑰不可導出,這樣以來就又充分保證了私鑰等機密信息的安全性。用戶只能通過USBKey內部的CSP模塊訪問私密數據,提供了銀行級別的安全性。

由于USBkey具有極高的安全性,能夠很好的滿足考試系統對安全性的要求。因此,考試系統的數據安全通信流程架構設計如圖1所示。服務器端設有服務模塊和加解密模塊,考生機客戶端由瀏覽器和USBKey組成,而瀏覽器通過插件Plugin訪問USBKey。

上圖結構中分為考生機客戶端和服務器兩個部分。在客戶端部分,瀏覽器通過plugin調用插件,plugin采用C/C++語言開發(fā),封裝了USBkey提供的加解密算法C語言接口,并向瀏覽器提供用于RSA加解密的JavaScript接口;在java服務器端部分,采用軟加解密方式,調用編寫的CSP加解密算法模塊完成所需功能。

客戶端網頁和java服務器端通過RSA驗證用戶身份并傳輸數據的通信流程如下:

i.客戶端網頁通過確認按鈕,將頁面信息A(用戶名、密碼等)發(fā)送給服務器;

ii.服務器收到信息A后,將:信息A+當前系統時間+隨機碼序列(為了防止重放攻擊) 形成的數據B保存在服務器上,并通過服務器的加密函數將上述信息以客戶公鑰加密的方式加密成數據C發(fā)送給客戶端頁面;

m.客戶端收到該加密數據C后,用自己的私鑰解密,再用服務器公鑰加密后,形成數據D發(fā)還給服務器;

IV服務器收到數據D后,用自己的私鑰解密,并與服務器上原先保存的數據B進行比對,若完全一致,則服務器認為請求者是合法用戶,允許用戶的登錄操作。并通過該方式獲取對稱加密算法AES的會話秘鑰。

4 研究中遇到的技術難點及解決方案

4.1 公鑰導入問題

由于USBKey內部有一定的存儲空間,用來存儲用戶的私鑰、會話秘鑰以及數字證書等機密數據,而對該存儲空間的讀寫操作必須要通過USBKey內的CSP (Cryptographic Service Provider)模塊實現,用戶無法直接讀取數據。因此只有把服務器的公鑰導入到USBKey中才能讓CSP去訪問該公鑰,完成RSA加密。經研究發(fā)現USBkey提供的PKCS11接口中的C_CreateObject()函數能夠將封裝好的公鑰導入到USBKey中。C_CreateObject()的函數定義如下:

C_CreateObj ect創(chuàng)建了一個新的對象。hSession是對話的句柄;pTemplate指向對象的模板;uICount是模板中的屬性數;phObject指向接收新對象句柄的單元。

在使用該函數前,需要先定義公鑰模板并對其中的參數賦值.然后才能導入。模板定義方式如下:

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加解密通信問題

考生機客戶端和java服務器端進行雙向加密和解密的通信過程中,C/C++加密后的數據通過網絡傳輸到java服務器端進行解密時失敗,報出bad_key的錯誤;同時java服務器端加密的數據經由網絡傳送到C/C++客戶端解密時,也是失敗,同樣報出bad_key的錯誤。針對這個問題,研究發(fā)現,這與計算機體系中的字節(jié)序Big-Endian和Little-Endian有關。

4.2.1 大端模式與小端模式

在各種計算機體系結構中,對于字節(jié)、字、基本數據類型等的存儲機制有所不同,因而引發(fā)了計算機通信領域中一個很重要的問題,即通信雙方交流的信息單元(比特、字節(jié)、字、雙字等等)應該以什么樣的順序進行傳送。如果達不成一致的傳送順序規(guī)則,通信雙方將無法進行正確的編/譯碼從而導致雙方通信失敗。

現代的計算機系統一般采用字節(jié)(8 bit Byte)作為邏輯尋址單位。每個地址單元都對應著一個字節(jié),一個字節(jié)為8bit。然而在C/C++語言中除了8bit的char之外,還有16bit的wchar t型和short類型,32bit的Int及l(fā)ong類型,64位的double及l(fā)ong long類型(編譯器不同,基本數據類型所占的長度也可能不同,具體情況需根據編譯器自身的實現)。另外,對于位數大于8位的處理器,例如16位、32位或者64位的處理器,由于寄存器寬度大于一個字節(jié)(8 bit),那么必然存在著如何安排多個字節(jié)數據存儲順序(Byte Order)的問題。常見的字節(jié)存儲順序有兩種:Big Endian(High-byte first)和Little Endian (Low-byte first). IntelX86平臺采用Little Endian,而PowerPC處理器則采用了Big Endian。另外,對于大小端的處理也和編譯器的具體實現有關。

(1) Little-Endian,即小端存儲模式。就是指數據的高位字節(jié)保存在內存的高地址中,而數據的低字節(jié)保存在內存的低地址中。C/C++語言采用的存儲模式就是Little-Endian,比如有一個雙字節(jié)變量shortA-OX1234,那么A所代表的變量的第一個字節(jié)存儲的是OX34,第二個字節(jié)存數的是OX12.

(2) Big-Endian,即大端存儲模式。就是指數據的高位字節(jié)保存在內存的低地址中,而數據的低字節(jié)保存在內存的高地址中,這種存儲模式有點兒類似于把數據當作字符串順序處理:地址由小向大增加,而數據從高位往低位放。Java語言采用存儲模式是Big-Endian。比如在Java中有一個雙字節(jié)變量shortA-OX1234,那么A所代表的變量的第一個字節(jié)存儲的是OX12,第二個字節(jié)存數的是OX34;與C/C++語言中的正好相反。

另外在網絡字節(jié)序中:TCP/IP各層協議將字節(jié)序順序定義為Big-Endian,因此TCP/IP協議中使用的字節(jié)序通常稱之為網絡字節(jié)序。故而網絡中傳輸的數據為Big-Endian類型。

由以上字節(jié)序的介紹可知,一個C/C++中的UTF-16編碼的字母或者多余一個字節(jié)的基本數據類型(short類型,int類型,double類型等),傳輸到Java語言中,要轉換成java語言的Big-Endian位表示形式(逆序順序交換高低位字節(jié)),才能正確譯碼,反之亦然。

而RSA算法對數據的加密和解密算法均是基于大數質數分解的,比如一個1024位的公鑰的模數N,就是一個128字節(jié)大小的整數。其加密后的數據也是一個很大的整數。由于加密后的數據是一個大整數,多于一個字節(jié),便也存在大小端表示問題。因此在Java和C/C++中要對解密前的數據按字節(jié)進行反轉后才能解密成功。

4.2.2 加解密算法的數據轉換流程

為了避免數據的多字節(jié)存儲問題(如UTF-16編碼的雙字節(jié)字符,從C/C++語言與Java語言,就要進行字節(jié)序的轉換),不管何種語言,均將要加密的明文字符串轉換為UTF-8字節(jié)流,然后進行加密;解密完成時,再進行UTF-8解碼,最終形成正確的明文數據。這樣有兩個好處:

(l)可以避免UTF-16編碼字符帶來的大小端轉換問題

(2)同時由于使用的數據大部分為英文字符,由UTF-16轉換為UTF-8,可以節(jié)省一個字節(jié)的存儲空間,這樣便可減小要加密的字節(jié)數,加快加解密數據的速度。

因此,考生機客戶端(C/C++端)對數據RSA加密的數據轉換流程如圖2。首先,明文數據經過UTF-8編碼,然后調用USBKey中CSP模塊完成數據的加密,得到的數據按照一個字節(jié)一個字節(jié)的逆序翻轉,再經過Base64編碼,方便在網絡上進行傳輸,保證數據傳輸過程不會出現差錯。上述流程中,加密完的數據進行按字節(jié)逆序翻轉,是因為RSA加密運算的結果也是一個大整數,也存在大端存儲和小端存儲的問題,進行轉換后,方便JAVA服務器端進行數據的解密。

Java端進行解密時數據轉換流程如圖3。首先,收到的密文先經過Base64解碼,然后調用服務器端CSP模塊解密,最后經由UTF-8解碼,獲得最終的明文數據。

4.3 證書導出公鑰

在考生機客戶端和服務器通信的過程中,java服務器需要使用客戶端的公鑰加密數據,因此需要獲得客戶端公鑰。而客戶端的公鑰存儲在USBKey中的數字證書里。因此就需要從USBKey的證書中導出公鑰參數,即公鑰的模數N和指數E。然而由于RSA算法對數據的加密和解密算法均是基于大數質數分解的,模數N和指數E也都是一個大整數(Biginterger),因此其也存在大端表示和小端表示。C/C++采用LittleEndian,而Java采用Big Endian,因此從客戶端證書中讀取到N和E后,需要將其按字節(jié)反轉,轉換為java端大端存儲形式,才能得到正確的N和E,并用其進行RSA加密。

5 結論

本文為了解決自主開發(fā)的在線考試系統的安全問題,引人了PKI安全體系,在PKI基礎之上結合數字證書的形式解決了公鑰信息的存儲表示問題,通過把要傳輸的數字信息進行加密和簽名,保證信息傳輸的機密性、真實性、完整性和不可否認性。同時使用硬件USBKey的存儲空間存儲用戶的私鑰、會話秘鑰以及數字證書等機密數據,并通過該硬件保證用戶的私鑰不可導出,這樣以來就又充分保證了私鑰等機密信息的安全性。通過這個設計方案,提供了銀行級別的安全保障。本人還對這個設計方案進行了實現,解決了遇到的一些關鍵問題,尤其是C/C++和java跨語言的相互加密和解密的通信問題。

猜你喜歡
數據安全
高速公路ETC用戶隱私數據安全保護策略
我國5G數據安全保護供給不足,“四步”拉動產業(yè)發(fā)展
云計算中基于用戶隱私的數據安全保護方法
建立激勵相容機制保護數據安全
大數據云計算環(huán)境下的數據安全
大數據安全和隱私保護技術架構研究
實時數據庫系統數據安全采集方案
云環(huán)境中數據安全去重研究進展
數據安全重刪系統與關鍵技術研究
大數據安全搜索與共享