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

?

系統(tǒng)資源受限環(huán)境下的證書解析方法研究

2013-10-10 01:57:08邵奇峰龔雪容吳保中
關(guān)鍵詞:數(shù)字證書次序字段

邵奇峰,龔雪容,吳保中

(解放軍信息工程大學(xué),鄭州450005)

引 言

隨著信息技術(shù)的發(fā)展,基于數(shù)字證書的安全服務(wù)得到越來越廣泛的應(yīng)用。證書解析是數(shù)字證書應(yīng)用的基礎(chǔ),用于獲取證書中各字段的信息。目前已知的證書解析方法有 Microsoft 的 CryptoApi[1]和.net[2]、開 源 的 OpenSSL[3-4]等,均是在操作系統(tǒng)應(yīng)用層實(shí)現(xiàn)的,且 CryptoApi和.net只能在 Windows平臺(tái)中使用。內(nèi)核層解析時(shí),一般是將證書傳遞到應(yīng)用層進(jìn)行解析后再將結(jié)果送回,給證書驗(yàn)證和應(yīng)用帶來很大不便。盡管OpenSSL的證書解析方法具有較強(qiáng)的通用性,而且開源,但代碼復(fù)雜,占用系統(tǒng)資源較多,不適用于操作系統(tǒng)內(nèi)核層及嵌入式系統(tǒng)等資源受限環(huán)境。本文在證書格式研究的基礎(chǔ)上,給出了一種適用于資源受限環(huán)境下證書解析的方法,并在 Windows和Linux內(nèi)核層以及多款嵌入式設(shè)備中得到了應(yīng)用。

1 數(shù)字證書格式

目前廣泛應(yīng)用的數(shù)字證書格式為X509v3[5],其基本內(nèi)容包括基本證書域、簽名算法域和簽名值域三部分,如圖1所示,其中基本證書域又包括版本號(hào)、序列號(hào)等子域。

圖1 X509v3格式數(shù)字證書基本內(nèi)容

數(shù)字證書的格式用ASN.1語(yǔ)法進(jìn)行描述:

2 數(shù)字證書解析方法

數(shù)字證書在頒發(fā)時(shí)采用了非典型編碼規(guī)則(DER),該編碼規(guī)則是基本編碼規(guī)則(BER)的一個(gè)子集,ASN.1值與DER編碼之間為一一對(duì)應(yīng)關(guān)系[6]。DER編碼由TLV組成,即Tag、Length和Value,其中Tag為數(shù)據(jù)類型標(biāo)簽,Length為數(shù)值的字節(jié)長(zhǎng)度,Value是值。如果進(jìn)行通用化解析,即在事先不知道內(nèi)容格式的情況下解析出每個(gè)字段的類型、長(zhǎng)度、值,則需要考慮ASN.1語(yǔ)法的各種情況,代碼復(fù)雜,占用資源多且處理難度大。在Windows和Linux內(nèi)核層以及嵌入式設(shè)備等資源環(huán)境有限的情況下實(shí)現(xiàn)難度大且不必要。

在數(shù)字證書內(nèi)容格式已知的前提下,證書解析的關(guān)鍵就在于如何確定各字段的層次關(guān)系以及同層各域的次序,進(jìn)而快速定位各字段位置。因此,在資源受限環(huán)境下Tag字段可忽略,重點(diǎn)在于確定Length和Value字段的位置和值。

證書字段可分為兩類:次序固定字段和次序不固定字段?;咀C書域中的擴(kuò)展字段為次序不固定字段,其余字段均為次序固定字段,盡管基本證書域中的擴(kuò)展字段為次序不固定字段,但擴(kuò)展字段的集合在整個(gè)證書中的次序仍是固定的,即在AlgorithmIdentifier之前,在SubjectPublicKeylnfo之后。

在證書解析時(shí),無(wú)論是次序固定字段還是次序不固定字段,都必須先定位字段位置。

首先,確定字段所處的包裹層次。X509v3數(shù)字證書的層次關(guān)系如圖2所示,最外層是Certificate::=SEQUENCE{…},第 2層 是tbsCertificate、signatureAlgorithm和signature,第3層為version、serialNumber等。擴(kuò)展字段所處層次較多,從第3層到第5層都有,但有用信息在第5層,故在解析時(shí)要跳過第3和第4兩層。

圖2 證書層次關(guān)系圖

其次,在相應(yīng)層次確定該字段的位置。在X509v3格式數(shù)字證書中,同一層次的字段位置相對(duì)固定,因此在確定字段所處的層次位置后即可根據(jù)相對(duì)位置確定字段的最終位置。在字段位置確定后,次序固定字段在定位后可直接取該字段的值;次序不固定字段則需要獲取字段的OID進(jìn)行逐個(gè)比對(duì),直至找到為止。

以DN字段為例:首先,確定其所在的層次是第3層;然后,在第3層中根據(jù)相對(duì)關(guān)系可知DN字段在版本字段之后;從而最終定位DN字段在整個(gè)證書中的位置,獲取其值。

3 解析模塊實(shí)現(xiàn)

前面描述了數(shù)字證書中各字段的包裹關(guān)系及數(shù)字證書的解析方法,為在資源受限環(huán)境下快速定位數(shù)字證書中各字段位置,高效地解析證書,在數(shù)字證書解析模塊中定義了如下數(shù)據(jù)結(jié)構(gòu)TLV。其中tag表示標(biāo)簽,暫時(shí)不用;length表示pValue指向的數(shù)據(jù)長(zhǎng)度;selfLen表示TLV頭的長(zhǎng)度。

同時(shí)設(shè)計(jì)了ReadTLV、WalkCert、SearchExtField等函數(shù)。函數(shù)ReadTLV用于從二進(jìn)制數(shù)據(jù)流中獲取TLV信息。WalkCert函數(shù)根據(jù)層次和次序關(guān)系調(diào)用ReadTLV進(jìn)行解析,跳過不必要的數(shù)據(jù),定位所需字段的位置。對(duì)于擴(kuò)展字段,還需要通過SearchExtField進(jìn)行字段搜索,擴(kuò)展字段搜索采用OID比對(duì)方式進(jìn)行。在資源受限環(huán)境下數(shù)字證書解析的關(guān)鍵是證書中各字段的定位,下面給出WalkCert的定位方法:

定位到證書中各字段位置后,即可根據(jù)字段的定義類型進(jìn)行相應(yīng)的處理。在實(shí)現(xiàn)Windows和Linux內(nèi)核層的證書解析時(shí),還應(yīng)考慮以下幾個(gè)方面的問題[7]:

① 部分C庫(kù)中的函數(shù)在內(nèi)核中不能使用。如內(nèi)存分配函數(shù)malloc需要根據(jù)平臺(tái)使用不同的函數(shù),Windows平臺(tái)下使用ExAllocatePoolWithTag,Linux平臺(tái)下使用kmalloc。

② 缺乏像用戶空間一樣的保護(hù)機(jī)制。內(nèi)核可以發(fā)現(xiàn)應(yīng)用層程序非法訪問內(nèi)存,但如果內(nèi)核層程序發(fā)生內(nèi)存錯(cuò)誤,就會(huì)導(dǎo)致系統(tǒng)崩潰。

③ 內(nèi)核層程序可使用的堆棧很小,不能在函數(shù)中使用大數(shù)組。

④內(nèi)核層的程序執(zhí)行效率要高,避免長(zhǎng)時(shí)間占用CPU資源。

⑤要注意同步和競(jìng)爭(zhēng),避免發(fā)生死鎖,函數(shù)要可重入。

上面所述的方法同樣適用于證書撤銷列表(CRL)的解析。圖3給出了CRL的層次關(guān)系。

4 應(yīng)用情況及測(cè)試

本文描述的方法已在Windows和Linux內(nèi)核層、W78E58、TMS320C5416等環(huán)境中得到了應(yīng)用。由于證書解析是純軟件的執(zhí)行過程,與CPU的外圍電路無(wú)關(guān),并且采用C語(yǔ)言實(shí)現(xiàn),移植簡(jiǎn)單,因此下文不再描述硬件電路和上文已描述過的實(shí)現(xiàn)過程,僅就不同環(huán)境中實(shí)現(xiàn)時(shí)的注意事項(xiàng)進(jìn)行說明。

(1)Windows內(nèi)核層

讀取證書文件時(shí)要使用InitializeObjectAttributes、ZwCreateFile、ZwReadFile、ZwClose等函數(shù)。獲取證書中的時(shí)間時(shí)需要考慮時(shí)區(qū)本地化處理,轉(zhuǎn)換時(shí)要使用Rtl-TimeFieldsToTime、ExSystemTimeToLocalTime、RtlTimeToTimeFields等函數(shù)。C標(biāo)準(zhǔn)庫(kù)中sprintf使用Rtl-StringCbPrintfA替換。動(dòng)態(tài)內(nèi)存分配使用ExAllocate-PoolWithTag,釋放使用ExFreePool。另外,還要加入unicode和gb2312編碼的轉(zhuǎn)換數(shù)組。

在WDK.6001.18002環(huán)境下編譯為內(nèi)核動(dòng)態(tài)鏈接庫(kù)。方式是,在普通內(nèi)核模塊實(shí)現(xiàn)基礎(chǔ)上增加DllInitial-ize、DllUnload兩個(gè)函數(shù),均直接返回成功即可,將需要導(dǎo)出的函數(shù)聲明為extern。

圖3 CRL層次關(guān)系圖

(2)Linux內(nèi)核層

讀取證書文件時(shí)使用filp_open打開文件,get_fs、set_fs(KERNEL_DS)、vfs_read讀取文件,filp_close關(guān)閉文件。內(nèi)核中沒有相應(yīng)的時(shí)間轉(zhuǎn)換函數(shù),需要參考應(yīng)用層的代碼自行實(shí)現(xiàn)。C標(biāo)準(zhǔn)庫(kù)中的sprintf可直接使用。動(dòng)態(tài)內(nèi)存分配和釋放分別使用kmalloc(xx,GFP_KERNEL)、kfree,另外還要加入unicode和gb2312編碼的轉(zhuǎn)換數(shù)組。

編譯方式同普通內(nèi)核模塊,用insmod命令加載模塊。

(3)W78E58和TMS320C5416

在W78E58和TMS320C5416環(huán)境下,不支持動(dòng)態(tài)內(nèi)存管理,證書從外部存儲(chǔ)器讀入內(nèi)存中的全局?jǐn)?shù)組中,運(yùn)行時(shí)各函數(shù)使用指針參數(shù)傳遞證書數(shù)據(jù),不復(fù)制緩沖區(qū)。臨時(shí)數(shù)據(jù)可使用堆棧保存,本方法的堆棧使用量不超過512字節(jié)。時(shí)間轉(zhuǎn)換參考Linux應(yīng)用層代碼自行實(shí)現(xiàn),在沒有硬件時(shí)鐘的環(huán)境下該轉(zhuǎn)換不需要。若設(shè)備上不需要顯示證書名稱,則unicode編碼轉(zhuǎn)換數(shù)組也可以省去,以節(jié)省空間。

分別在Keil和CCS環(huán)境下編譯通過。由于是軟件方法,可以直接在兩種環(huán)境中進(jìn)行模擬測(cè)試。

常見的應(yīng)用層證書解析方法不適用于資源受限環(huán)境,無(wú)法和本文方法直接比較。此外,證書解析不是一種頻繁的操作,性能不是重要的考核指標(biāo)。基于上述考慮,表1僅給出了本方法在不同環(huán)境下的編譯代碼量和解析公鑰時(shí)的平均運(yùn)行時(shí)間(代碼數(shù)約1500行)。

表1 編譯代碼量和平均運(yùn)行時(shí)間

結(jié) 語(yǔ)

本文所描述的數(shù)字證書解析方法可方便地利用C語(yǔ)言實(shí)現(xiàn),在Windows和Linux內(nèi)核層以及嵌入式系統(tǒng)中具有廣泛的適應(yīng)性,已在Windows和Linux內(nèi)核層、8051單片機(jī)、TMS320C5416等多個(gè)環(huán)境中應(yīng)用,具備運(yùn)行穩(wěn)定、代碼量小、解析速度快等特點(diǎn),對(duì)開發(fā)人員有一定的參考價(jià)值。

[1]Cryptography Functions[CP/OL].[2013-01].http://msdn.microsoft.com.

[2]X509Certificate類 [CP/OL].[2013-01].http://msdn.microsof-t.com.

[3]OpenSS 源 碼 [CP/OL].[2013-01].http://www.openssl.org.

[4]譚曉青.利用OpenSSL建立PKI數(shù)字證書系統(tǒng)[J].科學(xué)技術(shù)與工程,2005(20):1552-1554.

[5]IETF.RFC3280Internet X509Public Key Infrastructure Certificate and Certificate Revocation List(CRL)rofile[DB/OL].(2002-04)[2013-01].http://w-ww.ietf.org.

[6]GB/T 16263.1-2006信息技術(shù) ASN.1編碼規(guī)則第1部分:基本編碼規(guī)則(BER)、正則編碼規(guī)則(CER)和非典型編碼規(guī)則(DER)規(guī)范[S].

[7]譚文,楊瀟,邵堅(jiān)磊.寒江獨(dú)釣:Windows內(nèi)核安全編程[M].北京:電子工業(yè)出版社,2009.

猜你喜歡
數(shù)字證書次序字段
《漢紀(jì)》對(duì)漢帝功業(yè)次序的重構(gòu)及其意義
圖書館中文圖書編目外包數(shù)據(jù)質(zhì)量控制分析
生日謎題
當(dāng)心黑客利用數(shù)字證書的漏洞
基于數(shù)字證書的軍事信息系統(tǒng)安全防護(hù)方案
管理好系統(tǒng)中的數(shù)字證書
電腦迷(2015年7期)2015-05-30 04:50:35
CNMARC304字段和314字段責(zé)任附注方式解析
放假一年
無(wú)正題名文獻(xiàn)著錄方法評(píng)述
吉林省支付清算系統(tǒng)參與者數(shù)字證書使用現(xiàn)狀調(diào)查與現(xiàn)存問題分析及建議
耿马| 乐业县| 佛冈县| 八宿县| 广河县| 达日县| 许昌市| 基隆市| 黑水县| 常熟市| 澄江县| 罗山县| 禄丰县| 故城县| 来安县| 衡阳县| 江孜县| 阿拉尔市| 靖安县| 临清市| 桦南县| 建瓯市| 广德县| 宝山区| 镇安县| 剑河县| 奉节县| 丹江口市| 大丰市| 华宁县| 太仆寺旗| 壤塘县| 忻州市| 唐河县| 府谷县| 安庆市| 赫章县| 广平县| 岳普湖县| 临猗县| 前郭尔|