陳策,姜曉輝,胡勇
(解放軍63961部隊(duì),北京100012)
裝備軟件狀態(tài)標(biāo)識(shí)的消息認(rèn)證碼*
陳策,姜曉輝,胡勇
(解放軍63961部隊(duì),北京100012)
消息認(rèn)證技術(shù)中的散列函數(shù)可以產(chǎn)生與消息內(nèi)容緊密相關(guān)的消息認(rèn)證碼,可以據(jù)此對(duì)裝備中的軟件進(jìn)行狀態(tài)標(biāo)識(shí)。通過(guò)Visual C++與C#混合編程,建立了基于MD5算法的消息認(rèn)證的實(shí)驗(yàn)系統(tǒng),并進(jìn)行了內(nèi)容相關(guān)性、抗碰撞與軟件狀態(tài)標(biāo)識(shí)實(shí)驗(yàn)。結(jié)果表明,與當(dāng)前普遍采用的軟件版本號(hào)實(shí)現(xiàn)軟件版本狀態(tài)管理相比,消息認(rèn)證碼可以避免人為疏忽所造成的裝備軟件狀態(tài)管理的失效,是一種有效的裝備軟件狀態(tài)標(biāo)識(shí)的技術(shù)手段。
軟件版本標(biāo)識(shí),消息認(rèn)證,散列函數(shù),軟件狀態(tài)管理
在當(dāng)前軟件版本管理中,通常采用<major>.<minor>.<build>.<revision>4部分的方式對(duì)軟件版本進(jìn)行標(biāo)識(shí),如某指控系統(tǒng)中空情處理軟件構(gòu)件用0.2.0.0標(biāo)識(shí)。通過(guò)版本標(biāo)識(shí),軟件開(kāi)發(fā)者、管理者以及最終的產(chǎn)品用戶(hù)可以從標(biāo)識(shí)中獲知軟件的狀態(tài)變化信息,實(shí)現(xiàn)對(duì)軟件的有序維護(hù)和升級(jí)[1-3]。軟件的版本標(biāo)識(shí)與管理確保了軟件發(fā)布過(guò)程的可重復(fù)性、可控制性和可跟蹤性,但以上述形式所標(biāo)識(shí)的軟件版本信息有其固有的缺陷,由于版本標(biāo)識(shí)同軟件本身的內(nèi)容無(wú)關(guān),當(dāng)軟件內(nèi)容發(fā)生變化后,由于配置管理員的疏忽,可能會(huì)忘記或者沒(méi)有按照預(yù)定的規(guī)則更新軟件版本標(biāo)識(shí),從而造成軟件配置管理的失效,在現(xiàn)實(shí)中存在著大量的由于版本控制疏忽所導(dǎo)致的軟件失效。
在網(wǎng)絡(luò)安全中,為防止信息在傳輸和存儲(chǔ)過(guò)程中可能遭受的攻擊和破壞,會(huì)采用消息認(rèn)證技術(shù)來(lái)驗(yàn)證信息的真實(shí)性和完整性,消息認(rèn)證技術(shù)所采用的消息認(rèn)證碼與信息內(nèi)容緊密相關(guān),信息內(nèi)容一個(gè)字節(jié)的變化都會(huì)引起消息認(rèn)證碼的變化,這很好地契合了軟件版本標(biāo)識(shí)需要與軟件內(nèi)容相關(guān)的要求。本文采用消息認(rèn)證的方法對(duì)軟件進(jìn)行版本標(biāo)識(shí),使軟件的版本標(biāo)識(shí)與軟件內(nèi)容緊密相關(guān),軟件中任何一個(gè)字節(jié)內(nèi)容的變化都必將引起軟件版本標(biāo)識(shí)的變更,為軟件配置管理的有效實(shí)施提供了技術(shù)上的保障?;谙⒄J(rèn)證技術(shù)的軟件狀態(tài)標(biāo)識(shí)方法為裝備軟件的狀態(tài)管理提供了一種有效的技術(shù)手段,可以確保軟件狀態(tài)管理的有序?qū)嵤?/p>
消息認(rèn)證技術(shù)可以防止攻擊者對(duì)系統(tǒng)的主動(dòng)攻擊,消息認(rèn)證主要達(dá)到兩個(gè)目標(biāo):一是驗(yàn)證消息的真實(shí)性,二是驗(yàn)證消息的完整性。實(shí)現(xiàn)消息認(rèn)證需要用認(rèn)證函數(shù)對(duì)消息生成某種形式的認(rèn)證標(biāo)志,可以使用消息加密、消息認(rèn)證碼和hash函數(shù)3種方法來(lái)產(chǎn)生認(rèn)證函數(shù),消息加密和消息認(rèn)證碼采用共享密鑰加密算法產(chǎn)生消息的認(rèn)證標(biāo)志,hash函數(shù)是不使用加密的認(rèn)證方法。由于加密算法軟件運(yùn)算速度慢、硬件費(fèi)用高、算法專(zhuān)利保護(hù)和出口限制等因素,人們更傾向于使用hash函數(shù)實(shí)現(xiàn)消息的認(rèn)證。
1.1散列函數(shù)
hash函數(shù)又稱(chēng)哈希函數(shù)或散列函數(shù),其功能是將一個(gè)任意長(zhǎng)度的消息變換為一個(gè)較短的固定長(zhǎng)度的輸出串,該固定長(zhǎng)度的輸出串與消息的所有比特相關(guān),常稱(chēng)為消息的hash值、散列值或消息摘要。對(duì)于特定的數(shù)據(jù)而言,其hash值是唯一的,一旦數(shù)據(jù)發(fā)生變化,則對(duì)應(yīng)的“數(shù)字指紋”也會(huì)發(fā)生變化。設(shè)M是所有可能消息m的集合,Y是由所有可能的消息摘要y形成的有限集,則把從無(wú)限集M到有限集Y的映射稱(chēng)為一個(gè)hash函數(shù)。
hash函數(shù)應(yīng)滿(mǎn)足如下6個(gè)特性[4-6]:①輸入消息的長(zhǎng)度應(yīng)沒(méi)有限制,hash函數(shù)應(yīng)能作用于任何大小的數(shù)據(jù)分組;②hash函數(shù)作用于任意長(zhǎng)度的消息后得到固定長(zhǎng)度的輸出;③對(duì)任意給定的消息m,計(jì)算y=h(m)比較容易,適合用軟硬件快速實(shí)現(xiàn);④對(duì)任意給定的消息m,消息摘要y與m的每一比特信息高度相關(guān),只要改變消息m的任意一位或多位,摘要值就會(huì)發(fā)生顯著改變,此性質(zhì)被稱(chēng)為hash函數(shù)的雪崩性;⑤對(duì)任意給定的消息m,找到滿(mǎn)足y=h(m)的消息m是困難的,即hash求逆在計(jì)算上是不可行的,這是hash函數(shù)的單向性;⑥對(duì)任意給定的消息m,找到另一個(gè)不同的消息m',使得h(m)=h(m')在計(jì)算上是不可行的,這是hash函數(shù)的抗碰撞性。
1.2MD5算法
hash函數(shù)中比較有名的是MD5算法,該算法以512位分組來(lái)處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過(guò)了一系列處理后,算法的輸出由4個(gè)32位分組組成,將這4個(gè)32位分組級(jí)聯(lián)后將生成一個(gè)128位共16個(gè)字節(jié)的摘要值。圖1給出了MD5算法的總體實(shí)現(xiàn)過(guò)程。
圖1 MD5算法的總體實(shí)現(xiàn)過(guò)程
算法首先需要對(duì)信息進(jìn)行填充,使其位長(zhǎng)度對(duì)512求余的結(jié)果等于448。因此,信息的位長(zhǎng)度將被擴(kuò)展至N×512+448,即N×64+56個(gè)字節(jié),N為一個(gè)非負(fù)整數(shù)。填充的方法如下,在信息的后面填充一個(gè)1和無(wú)數(shù)個(gè)0,直到滿(mǎn)足上面的條件時(shí)才停止用0對(duì)信息的填充。然后,再在這個(gè)結(jié)果后面附加一個(gè)以64位共8個(gè)字節(jié)的二進(jìn)制表示的填充前信息長(zhǎng)度。信息填充后被分解為長(zhǎng)度為512位的N+1個(gè)信息分組,每個(gè)信息分組為64個(gè)字節(jié),將4個(gè)字節(jié)表示為一個(gè)整數(shù),則每個(gè)信息分組包含16個(gè)整數(shù)。算法開(kāi)始時(shí),設(shè)置4個(gè)被稱(chēng)作鏈接變量的整數(shù)參數(shù),分別為:A、B、C、D,為這4個(gè)鏈接變量設(shè)置初始值后,就開(kāi)始進(jìn)入算法的循環(huán)運(yùn)算,循環(huán)的次數(shù)是信息中信息分組的數(shù)目,每次循環(huán)針對(duì)信息分組mi進(jìn)行,循環(huán)前先將上面4個(gè)鏈接變量復(fù)制到另外4個(gè)變量中:A到a,B到b,C到c,D到d,然后對(duì)信息分組mi所包含的16個(gè)整數(shù)Xj(j=0~15)執(zhí)行經(jīng)壓縮函數(shù)f的壓縮處理。壓縮函數(shù)f由4輪,每輪16步組成,具體算法可參見(jiàn)文獻(xiàn)[6]。
1.3算法的實(shí)現(xiàn)
利用MD5算法建立消息認(rèn)證的實(shí)驗(yàn)系統(tǒng),驗(yàn)證MD5算法在生成消息認(rèn)證碼中的有效性,實(shí)驗(yàn)系統(tǒng)MD5算法模塊采用Visual C++編寫(xiě),人機(jī)交互界面采用Visual Studio 2010 C#.net實(shí)現(xiàn),之所以要編寫(xiě)MD5算法模塊與人機(jī)交互界面分開(kāi)不同語(yǔ)言實(shí)現(xiàn)的實(shí)驗(yàn)系統(tǒng),是因?yàn)閂isual C++編寫(xiě)算法模塊更為容易,C#.net編寫(xiě)人機(jī)交互界面更為容易,另外,也是為了驗(yàn)證.net中不同語(yǔ)言間集成的方便性[7]。
由于需要消息認(rèn)證的文件會(huì)很大,可能無(wú)法一次性地把文件內(nèi)容全部讀到緩存區(qū)中,在實(shí)現(xiàn)文件的消息認(rèn)證時(shí),采取每次讀取最多1 024個(gè)字節(jié)的方法進(jìn)行摘要值更新。打開(kāi)文件后,每次讀取1 024個(gè)字節(jié)進(jìn)行壓縮,當(dāng)讀完文件后,關(guān)閉文件指針,進(jìn)行信息內(nèi)容的填充,在所填充信息的第56個(gè)字節(jié)處附加8個(gè)字節(jié)表示的位長(zhǎng)度信息,更新最后填充的64個(gè)字節(jié),最后產(chǎn)生16個(gè)字節(jié)的消息認(rèn)證碼。在消息認(rèn)證算法中,核心是更新壓縮update的算法模塊,在該模塊中要不斷取出一個(gè)分組64個(gè)字節(jié)進(jìn)行壓縮,update輸入需要壓縮的數(shù)據(jù)包和數(shù)據(jù)包長(zhǎng)度,方法內(nèi)部實(shí)現(xiàn)對(duì)輸入數(shù)據(jù)包的壓縮,當(dāng)數(shù)據(jù)包不是64個(gè)字節(jié)的整數(shù)倍時(shí),對(duì)于最后一個(gè)不足64個(gè)字節(jié)的包,需要留到下一次再使用update壓縮時(shí)用補(bǔ)齊64個(gè)字節(jié)再進(jìn)行壓縮。該算法的流程如圖2所示。
圖2 更新壓縮update的算法流程
首先計(jì)算上次使用update壓縮時(shí)有無(wú)留下的未被壓縮處理的數(shù)據(jù)包內(nèi)容,未被壓縮處理的數(shù)據(jù)內(nèi)容必定為小于64個(gè)字節(jié)的數(shù)據(jù)包;計(jì)算留下的未被壓縮處理的數(shù)據(jù)包長(zhǎng)度index及需要補(bǔ)充的長(zhǎng)度partLen=64-index;判斷輸入數(shù)據(jù)包的長(zhǎng)度是否大于需要補(bǔ)充的長(zhǎng)度,如果大于需要補(bǔ)齊的長(zhǎng)度則補(bǔ)齊后進(jìn)行transform壓縮運(yùn)算,然后將輸入數(shù)據(jù)包剩余的數(shù)據(jù)包取64個(gè)字節(jié)的整數(shù)倍的數(shù)據(jù)進(jìn)行每64個(gè)字節(jié)一個(gè)循環(huán)的transform壓縮運(yùn)算,最后將余下不足64個(gè)字節(jié)的數(shù)據(jù)包作為預(yù)留,等到下次再進(jìn)入update方法時(shí)處理。
為了對(duì)MD5消息認(rèn)證算法進(jìn)行驗(yàn)證,至少需要驗(yàn)證兩個(gè)方面的內(nèi)容,一是需驗(yàn)證所產(chǎn)生的消息認(rèn)證碼與信息內(nèi)容緊密相關(guān),二是需驗(yàn)證所產(chǎn)生的消息認(rèn)證碼具有超強(qiáng)的抗碰撞性。
2.1內(nèi)容相關(guān)性實(shí)驗(yàn)
根據(jù)軟件測(cè)試用例設(shè)計(jì)中等價(jià)類(lèi)劃分和邊界值分析的原則,分別生成具有1個(gè)字節(jié)、55個(gè)字節(jié)、56個(gè)字節(jié)、64個(gè)字節(jié)、2 013個(gè)字節(jié)、2 014個(gè)字節(jié)、2 112個(gè)字節(jié)的文件,針對(duì)每種長(zhǎng)度的文件,將文件中最后一個(gè)字節(jié)內(nèi)容由0x00改為0x01,檢查這些文件所產(chǎn)生的消息認(rèn)證碼。圖3所示為本文所編寫(xiě)的消息認(rèn)證實(shí)驗(yàn)程序及實(shí)驗(yàn)結(jié)果。
圖3 MD5算法消息認(rèn)證碼的驗(yàn)證程序
實(shí)驗(yàn)結(jié)果表明,這14個(gè)長(zhǎng)度或內(nèi)容均有所區(qū)別的文件所生成的消息認(rèn)證碼均不相同,即使文件只有1個(gè)字節(jié)的差別,所生成的消息認(rèn)證碼也會(huì)發(fā)生顯著變化,這符合散列函數(shù)的雪崩特性。
2.2抗碰撞性實(shí)驗(yàn)
為進(jìn)一步驗(yàn)證算法所具有的抗碰撞性,設(shè)計(jì)實(shí)驗(yàn)對(duì)計(jì)算機(jī)中各目錄存在的文件進(jìn)行消息認(rèn)證碼的生成,檢驗(yàn)是否有相同的消息認(rèn)證碼出現(xiàn),理論上MD5算法要產(chǎn)生碰撞至少需要25 616個(gè)文件才有可能產(chǎn)生一次碰撞,即使每個(gè)文件只占1個(gè)字節(jié)的大小,信息量都是非常大的。在實(shí)際應(yīng)用中,操作系統(tǒng)中會(huì)安裝多個(gè)軟件,利用本人的辦公計(jì)算機(jī)對(duì)MD5算法進(jìn)行抗碰撞實(shí)驗(yàn),計(jì)算機(jī)中的系統(tǒng)盤(pán)C盤(pán)中已經(jīng)安裝了20余個(gè)軟件,共有文件108 487個(gè),文件數(shù)達(dá)10萬(wàn)之多,占用空間33.9 GB。圖4為抗碰撞實(shí)驗(yàn)程序。
圖4 MD5算法的抗碰撞實(shí)驗(yàn)程序
經(jīng)實(shí)驗(yàn)后,所有具有相同認(rèn)證碼的文件,或者是同一文件但不同目錄,或者是不同文件但內(nèi)容相同,如果將文件的全路徑也作為文件信息的一部分,經(jīng)實(shí)驗(yàn)后,所有文件的消息認(rèn)證實(shí)驗(yàn)后,所有文件的消息認(rèn)證碼則均不相同。實(shí)驗(yàn)結(jié)果表明:MD5消息認(rèn)證算法的抗碰撞實(shí)驗(yàn)表明:將消息認(rèn)證碼作為文件的版本狀態(tài)控制信息是合適的。
2.3利用消息認(rèn)證碼實(shí)現(xiàn)軟件狀態(tài)標(biāo)識(shí)
表1 BattleBook.exe各版本消息認(rèn)證碼實(shí)驗(yàn)結(jié)果
選取一實(shí)際的軟件,對(duì)其主程序BattleBook.exe的不同版本進(jìn)行消息認(rèn)證碼生成,表1列出了消息認(rèn)證碼的實(shí)驗(yàn)結(jié)果。表中的文件版本標(biāo)識(shí)是BattleBook.exe資源區(qū)中所寫(xiě)的標(biāo)識(shí),在Visual studio 2010中用資源編輯器的方式打開(kāi)BattleBook.exe后,可以看到在Block Header中具有FileVersion字段,該字段是一個(gè)字符串,在編程時(shí)由開(kāi)發(fā)人員修改,這就會(huì)由于開(kāi)發(fā)人員的疏忽而忘記在修改了程序后修改該字段值,導(dǎo)致主程序BattleBook.exe的文件版本標(biāo)識(shí)即使程序已發(fā)生變化,但文件版本標(biāo)識(shí)卻沒(méi)有跟著變化。從文件修訂的日期來(lái)看,顯然文件的版本應(yīng)不同。如果用文件版本標(biāo)識(shí)加版本日期的方法是否就能明確標(biāo)識(shí)一個(gè)文件的版本呢?答案也是否定的,因?yàn)榘姹救掌谑怯?jì)算機(jī)根據(jù)時(shí)間所生成的,同樣不會(huì)跟內(nèi)容相關(guān)。表中不同版本的5個(gè)BattleBook.exe,其消息認(rèn)證碼各不相同,用消息認(rèn)證碼的方式來(lái)標(biāo)識(shí)文件版本就可以避免人為的疏忽所造成的版本狀態(tài)無(wú)法管理的混亂。利用Visual studio 2010,可以用資源編輯器的方式打開(kāi)BattleBook. exe并修改FileVersion的字段值,將該字段值由字符串“1.0.0.1”修改為相應(yīng)的消息認(rèn)證碼,這樣就可以標(biāo)識(shí)出不同版本的程序。
消息認(rèn)證技術(shù)是網(wǎng)絡(luò)安全中的一項(xiàng)重要技術(shù),可以實(shí)現(xiàn)對(duì)消息的完整性和真實(shí)性認(rèn)證,用消息認(rèn)證碼對(duì)裝備軟件進(jìn)行版本標(biāo)識(shí)可以更有效地實(shí)現(xiàn)軟件的狀態(tài)管理,本文所實(shí)現(xiàn)的算法和實(shí)驗(yàn)系統(tǒng)充分證明了這一點(diǎn),在微軟.Net框架中已經(jīng)用強(qiáng)命名規(guī)則實(shí)現(xiàn)了這一理念,在裝備軟件狀態(tài)控制方面,迫切需要將這種技術(shù)加以應(yīng)用。本文所實(shí)現(xiàn)的軟件狀態(tài)標(biāo)識(shí)還只能利用Visual studio 2010資源編輯器將所生成的消息認(rèn)證碼加入軟件的主程序中,后續(xù)的工作是進(jìn)一步研究軟件信息的組成,尤其是操作系統(tǒng)中可執(zhí)行文件的格式,自動(dòng)將消息認(rèn)證碼注入到軟件主執(zhí)行程序中,同時(shí)進(jìn)一步研究利用軟件中的消息認(rèn)證碼進(jìn)行裝備軟件狀態(tài)認(rèn)證的方法和開(kāi)發(fā)裝備軟件狀態(tài)認(rèn)證系統(tǒng),確保將陸軍裝備科研訂購(gòu)部裝備軟件管理規(guī)定所要求的裝備軟件狀態(tài)管理落到實(shí)處。
[1]劉燕秋,勉玉靜,趙文耘.軟件配置管理中版本管理技術(shù)研究[J].計(jì)算機(jī)工程與應(yīng)用,2003,21(7):68-71.
[2]張為.現(xiàn)代軟件開(kāi)發(fā)的過(guò)程管理方法研究[J].計(jì)算機(jī)工程與科學(xué),2003,25(2):99-103.
[3]倪曉峰,趙文耘,張捷.構(gòu)件軟件配置管理以及其版本控制技術(shù)研究[J].計(jì)算機(jī)工程與應(yīng)用,2005,23(2):94-96.
[4]鄧元慶,龔晶,石會(huì).密碼學(xué)簡(jiǎn)明教程[M].北京:清華大學(xué)出版社,2011:144-146.
[5]肖皇培,張國(guó)基.基于Hash函數(shù)的報(bào)文鑒別方法[J].計(jì)算機(jī)工程,2007,33(6):101-103.
[6]張裔智,趙毅,湯小斌.MD5算法研究[J].計(jì)算機(jī)科學(xué),2008,35(7):295-297.
[7]Troelsen A.Pro C#and the.Net 4 Platform[M].Ituring Press,2011:86-98.
Message Authentication Code of Equipment Software Status Identification
CHEN Ce,JIANG Xiao-hui,HU Yong
(63961 Troops of PLA,Beijing 100012,China)
Hash function of message authentication technology can produce the message authentication code which closely related to the content of message,by this way,equipment software status can be identified.Through the Visual c++and c#hybrid programming,message authentication experiment system based on MD5 algorithm is established,content correlation,impact resistance and software status identification experiment are executed.The results show that message authentication code can avoid the failure of equipment software status management caused by human negligence compared to software version number generally used to realize software version management and messageauthenticationcodeisakindofeffectivetechnologyofequipmentsoftwarestatus identification.
software version identification,message authentication,hash function,software status management
TP311.52
A
1002-0640(2015)08-0169-04
2014-06-15
2014-07-27
軍隊(duì)科研計(jì)劃基金資助項(xiàng)目(ZLC12501)
陳策(1975-),男,山西萬(wàn)榮人,博士、副研究員。研究方向:軟件工程,軟件測(cè)試。