謝文
摘要:隨著計算機技術(shù)的不斷進步,軟件在現(xiàn)實世界中的應用日益重要。開發(fā)軟件的時間和精力也在增加。軟件許可協(xié)議是需要從用戶的角度來保護軟件的開發(fā)人員的知識產(chǎn)權(quán)。然而,軟件盜竊和許可侵權(quán)案件每年都在增加。在本文中我們介紹了幾種用于確定軟件版權(quán)信息的軟件水印方法。我們在幾個評價指標下比較了它們的特點和性能。在一些軟件盜版的案例中軟件水印被認為是保護和檢測的有效方法。
關(guān)鍵詞:軟件版權(quán)保護;軟件許可證;軟件水印
中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2016)19-0232-04
1 概述
隨著網(wǎng)絡(luò)的高速發(fā)展以及各種軟件的廣泛應用,在現(xiàn)實環(huán)境中電腦系統(tǒng)的使用是必要的。此外,軟件在計算環(huán)境中的作用變得更加重要,在這些環(huán)境中,它需要更多的時間和精力開發(fā)新的軟件。為了保護這些軟件作為其開發(fā)者的知識產(chǎn)權(quán),軟件許可協(xié)議軟件的用戶需要遵守軟件許可協(xié)議。軟件許可證是為了保護軟件的版權(quán)。然而,侵犯軟件許可證的案件每年都在增加。同時,因此而造成的經(jīng)濟損失也逐年增加。
在本文中,我們介紹幾種軟件水印方法去識別軟件版權(quán)信息并根據(jù)績效標準來比較這些軟件水印的性能。本論文的主要工作如下:在第2節(jié)中,分別介紹了軟件水印中靜態(tài)水印和動態(tài)水印的概念。在3節(jié)中,我們解釋了軟件水印的性能評估指標。在4節(jié)中,我們比較了靜態(tài)和動態(tài)軟件水印方法的性能,并在第5節(jié)中得出結(jié)論。
2 軟件水印
2.1 軟件水印的概念
最近,出現(xiàn)了幾種保護軟件版權(quán)的技術(shù),一般情況下,水印技術(shù)所用來嵌入的版權(quán)信息是以數(shù)字媒體形式表示的二進制數(shù)據(jù)。這種方法經(jīng)常用于多媒體產(chǎn)品,例如圖像,音頻和視頻。該方法將版權(quán)信息嵌入到多媒體產(chǎn)品中,并在需要信息時識別插入的信息。如果這些產(chǎn)品的版權(quán)信息是不確定的,插入的版權(quán)可以是一個證據(jù),通過識別先前插入的信息來驗證產(chǎn)品的所有權(quán)。
軟件水印是一種將這種技術(shù)應用于軟件領(lǐng)域的一種方法。插入的版權(quán)信息可以是軟件所有權(quán)的證據(jù)。軟件水印由以下兩個功能實現(xiàn):
圖1顯示了應用軟件水印來識別軟件版權(quán)信息的過程。在原始程序P發(fā)布之前,水印W通過embed()函數(shù)及密鑰K嵌入到程序中。這樣水印嵌入完成并發(fā)布到用戶手中。然后,如果是可疑的軟件用于未經(jīng)許可的其他軟件,可疑軟件可以通過使用recognize()函數(shù)及密鑰K來識別先前嵌入的水印。
2.2 靜態(tài)軟件水印
靜態(tài)軟件水印是一種通過軟件分析來識別嵌入到程序中的水印的無定向的方法。這種方法不需要通過執(zhí)行程序來識別水印。因此,它比動態(tài)的方法更方便,因為軟件的執(zhí)行需要額外的資源去應對各種各樣的對執(zhí)行環(huán)境所造成的影響。
2.2.1數(shù)據(jù)水印
數(shù)據(jù)水印是將水印嵌入到軟件中的最簡單的方法。這種方法將包含數(shù)據(jù)水印的信息插入軟件中指定的位置。例如,可以在軟件代碼中插入版權(quán)信息如下:
字符串水印=“版權(quán)?2014.水印信息.”;插入的版權(quán)信息可以被用來識別軟件的所有權(quán)。這種簡單的嵌入與識別水印的方法可以非常容易的應用到軟件中。然而,由于嵌入的水印信息很容易暴露,所以它很容易被開發(fā)者或用戶發(fā)現(xiàn)并刪除。
2.2.2 代碼水印
代碼水印是通過在程序中添加額外的代碼信息的方式來嵌入水印信息。依據(jù)程序結(jié)構(gòu)分析的方法,這種方式可以以各種形式被應用。作為這些方法的一個應用程序,可以通過采用分支指令來表示程序的版權(quán)信息,使用分支指令的基本塊的順序來表示。
Davidson 等人提出了一種通過重新定位基本塊的順序嵌入水印的方法。插入的水印信息是按照字典順序重新排序的基本塊。水印信息可以通過對重新排序的基本塊的解釋來加以識別?;緣K的順序仍保持在它的原始順序,之前嵌入的水印可以被識別。這種類型的水印不是暴露在外部的程序。因此,這種方法比前面描述的數(shù)據(jù)水印的隱蔽性要好。然而,這種插入水印信息的方法需要額外的添加程序代碼。它還需要分析在一個程序中的基本塊的順序以識別嵌入式水印。
2.3 動態(tài)軟件水印
與靜態(tài)軟件水印不同,動態(tài)軟件水印是一種通過對軟件運行的中間狀態(tài)進行分析來實現(xiàn)水印嵌入與提取的方法。這種方法需要對程序的建模行為以及嵌入水印的位置進行額外的分析。所以該方法將水印嵌入到程序的執(zhí)行狀態(tài)中。然后,它可以通過解釋程序執(zhí)行時的狀態(tài)或行為識別水印。
2.3.1 復活節(jié)彩蛋水印
復活節(jié)彩蛋水印是通過在軟件中輸入特定輸入的方式來隱藏水印信息。例如,特別是在游戲軟件中,當有密鑰需要輸入時,彩蛋水印被作為隱藏的信息包含其中。復活節(jié)彩蛋水印的方法是插入代碼來表達軟件水印的版權(quán)信息,輸入時調(diào)用預定義的特定的輸入。水印信息可能包含版權(quán)信息或特定的形象表示軟件的所有權(quán)。因此,識別軟件中嵌入的復活節(jié)蛋水印可以證明該軟件的所有權(quán)。
在這種方法中,如果不輸入之前定義的特定輸入,嵌入的水印不會出現(xiàn)。因此,在程序執(zhí)行過程中可能是很難找到嵌入式水印的。然而,水印本身是公開暴露在它的程序代碼中的。因此,通過分析程序代碼可以很容易地找到水印。
2.3.2 數(shù)據(jù)結(jié)構(gòu)水印
數(shù)據(jù)結(jié)構(gòu)水印是一種將程序執(zhí)行過程中構(gòu)造的數(shù)據(jù)結(jié)構(gòu)水印信息嵌入到運行狀態(tài)中的一種方法。這種方法當程序遇到一個指定的運行時狀態(tài)或輸入時,通過先前設(shè)計的數(shù)據(jù)結(jié)構(gòu)表示版權(quán)信息。例如,這種方法可以在程序執(zhí)行過程中連續(xù)地單擊屏幕的特定區(qū)域,將包含版權(quán)信息的變量或鏈接列表鏈接起來。這樣的數(shù)據(jù)結(jié)構(gòu)可以編碼水印信息來表示軟件版權(quán)信息。因此,如果成功地解釋了所生成的數(shù)據(jù)結(jié)構(gòu),則可以證明該軟件的所有權(quán)。
數(shù)據(jù)結(jié)構(gòu)水印是非常隱蔽的且有彈性的,因為在所定義的輸入序列或數(shù)據(jù)結(jié)構(gòu)的定義不暴露的情況下該水印是不能被用戶發(fā)現(xiàn)。然而,這種方法需要額外的結(jié)構(gòu)來生成數(shù)據(jù)結(jié)構(gòu)水印的嵌入程序代碼。它還需要額外的分析,以解釋所產(chǎn)生的數(shù)據(jù)結(jié)構(gòu)來確定該軟件的所有權(quán)。
3 軟件水印的性能標準
為了將軟件水印技術(shù)應用到應用軟件中,在水印的嵌入與識別上應該有好的實用性能表現(xiàn)。有幾種用來衡量軟件水印性能的評價標準。在本文中,我們應用邁爾斯等人提出的評價標準對前一章節(jié)中提到的幾種軟件水印的性能進行比較。在本節(jié)中,我們描述了6項評估軟件水印性能的標準。
3.1 可靠性
在軟件版權(quán)信息必須得到確認的情況下,軟件水印信息的識別應該很容易做到。此外,識別水印應該足夠可靠的確認版權(quán)信息沒有假陽性,一避免降低水印的可靠性。因此水印識別應成為確認軟件版權(quán)信息的有力證據(jù)。
3.2 數(shù)據(jù)率
為了在將來識別軟件的版權(quán)信息,軟件水印的嵌入應該在軟件發(fā)布之前完成。水印的嵌入需要在軟件中開辟額外的空間。如果所需的額外空間相比于最初的軟件的大小過大,會導致嵌入的水印很容易被發(fā)現(xiàn)并攻擊。因此,嵌入水印所需的額外空間的比例相比于原來的程序應該要足夠的低,以保證軟件水印的隱蔽性
3.3 隱蔽性
嵌入的水印應該能夠被軟件的所有者識別以驗證軟件的版權(quán)信息。但是,如果在程序執(zhí)行或修改過程中容易被其他用戶或開發(fā)人員披露或刪除水印,則該方法不能被應用到軟件中。因此,水印不應該是明顯的相對于其他用戶具有高隱身。
3.4 水印分散性
為了保證軟件水印在軟件真實環(huán)境下的應用,嵌入的水印需要在用戶隨意修改后仍能保存其版權(quán)信息。為了滿足這一特性,把水印分散的嵌入在整個程序中,相比于將其嵌入到程序中特定的局部區(qū)域效果要更好。
3.5 開銷
若嵌入和識別軟件水印所花費時間和精力太高,則水印方法不能用于實際應用。此外,如果插入軟件水印后降低了軟件的執(zhí)行性能,這種水印在實際應用中也是不能使用的。因此,在水印的嵌入與識別的同時,還要保證其效率。此外,在軟件中嵌入水印后不能影響軟件的執(zhí)行能力。
3.6 彈性
當軟件已被用戶使用或是新開發(fā)的軟件,通過優(yōu)化或混淆等多種方式可以對其進行改變或破壞。在這樣的環(huán)境下,嵌入的水印應仍然保存有完整的版權(quán)信息。因此,水印的彈性是軟件水印所必不可少的,在實際使用中當軟件被攻擊者或用戶通過各種方式加以破壞或修改時,它可以用于保護軟件的版權(quán)信息。
4 軟件水印的性能比較
在這一節(jié)中,我們根據(jù)每個方法的性能特點按照在前一節(jié)中提出的評價標準對軟件水印的性能進行比較。單個水印的性能可能會因為水印的執(zhí)行環(huán)境或?qū)嵤┓椒òl(fā)生改變。因此,我們嘗試將軟件水印的性能與軟件水印的一般特性進行比較。表1是按照軟件水印的6種評估標準對軟件水印的性能進行比較后的結(jié)果。
4.1 靜態(tài)水印比較
4.1.1 可靠性
在數(shù)據(jù)水印中,水印被直接嵌入到軟件本身的代碼中,而不需要隱藏水印的存在。因此,它是軟件版權(quán)的一個明顯的證據(jù)。然而,因為嵌入的水印是被公開的,所以通過代碼分析軟件很容易識別。在代碼水印中,水印被嵌入到程序代碼中。當一個嵌入了水印的程序被用戶使用并改變后,可能會使得嵌入的水印信息也被修改。在這種情況下,代碼水印可能無法成功識別。
4.1.2 數(shù)據(jù)率
在數(shù)據(jù)水印中嵌入的水印是非常小的,因為在那里幾乎對除其本身的水印數(shù)據(jù)外沒有額外空間。然而,在代碼水印中,它需要修改程序的代碼,并插入額外的代碼來嵌入水印。
4.1.3 隱蔽性
在數(shù)據(jù)水印,嵌入的水印可以很容易地通過分析程序代碼被發(fā)現(xiàn),因為嵌入的信息以其源碼形式公開。然而,在代碼水印中,嵌入的水印被隱藏為軟件代碼內(nèi)的一部分,因此它需要分析該程序代碼來發(fā)現(xiàn)存在的水印。因此,代碼水印比數(shù)據(jù)水印更加隱蔽。
4.1.4 水印的分散性
在數(shù)據(jù)水印中,由于水印是被嵌入到特定的局部區(qū)域中的,所以很難做到將水印信息分布到軟件的整個區(qū)域中來保護軟件版權(quán)。然而,在代碼水印中,水印信息會通過修改源代碼的方式將其嵌入到軟件中,并且將其分布于軟件的多個區(qū)域中。
4.1.5 開銷
在數(shù)據(jù)水印中,在程序中嵌入和識別水印很難影響軟件的執(zhí)行能力,因為數(shù)據(jù)水印的嵌入不需要執(zhí)行附加的軟件操作。在代碼水印中,它需要執(zhí)行附加操作以嵌入或識別水印。而且,水印的嵌入可能會影響軟件的執(zhí)行性能。所以,代碼水印的嵌入與識別只需要很少的開銷。
4.1.6 彈性
在數(shù)據(jù)水印中,用戶的修改或混淆可能會直接對水印產(chǎn)生影響,因為水印是直接暴露在外的,并未加以隱藏。在代碼水印中,水印被編碼成隱藏的軟件區(qū)域,并未直接暴露給用戶或開發(fā)者。因此,代碼水印的彈性比數(shù)據(jù)水印要好。
4.2 動態(tài)水印比較
4.2.1 可靠性
復活節(jié)彩蛋水印和數(shù)據(jù)結(jié)構(gòu)水印都是將水印嵌入到水印的執(zhí)行狀態(tài)中,而且在嵌入時還需要輸入一個特殊的預定義密鑰。因此,識別嵌入的水印是軟件著作權(quán)的有力證據(jù),不會產(chǎn)生誤報。
4.2.2 數(shù)據(jù)率
動態(tài)軟件水印的應用需在當控制流達到預定義的程序狀態(tài)時,嵌入額外的代碼來描述軟件運行時的執(zhí)行行為和執(zhí)行水印。特別是數(shù)據(jù)結(jié)構(gòu)水印需要額外的復雜代碼來生成特定的數(shù)據(jù)結(jié)構(gòu),用于表示水印信息。因此,數(shù)據(jù)結(jié)構(gòu)水印的嵌入與識別需要額外的附加空間。
4.2.3 隱蔽性
動態(tài)水印比靜態(tài)水印要更加隱蔽,因為動態(tài)水印是將水印嵌入到程序的執(zhí)行狀態(tài)中。在復活節(jié)彩蛋水印中,嵌入的水印通過代碼分析可以很容易地被發(fā)現(xiàn),因為水印公開暴露在程序代碼中。然而,數(shù)據(jù)結(jié)構(gòu)水印很難被發(fā)現(xiàn)的,因為只有當程序在執(zhí)行期間達到一個特定的運行狀態(tài)時水印才會生成。
4.2.4 水印的分散性
在復活節(jié)彩蛋水印中,水印通常嵌入到程序代碼的特定區(qū)域,并沒有將水印分散到程序的這個區(qū)域中。因此,水印被作為一個隱藏的代碼嵌入,這時只有一個預定義的特定輸入被輸入。另一方面,在數(shù)據(jù)結(jié)構(gòu)水印中,水印被嵌入在動態(tài)生成的數(shù)據(jù)結(jié)構(gòu)中。因此,用于產(chǎn)生水印的代碼可以被分配到軟件多個部分來提高水印的分散性。
4.2.5 開銷
在數(shù)據(jù)結(jié)構(gòu)水印中,設(shè)計數(shù)據(jù)結(jié)構(gòu)和實現(xiàn)代碼生成代表水印的數(shù)據(jù)結(jié)構(gòu)需要花費大量時間和精力。它還需要額外的運行時的開銷,用于執(zhí)行軟件生成附加的嵌入式數(shù)據(jù)結(jié)構(gòu)。然而,在復活節(jié)彩蛋水印中,水印可以很容易的被嵌入,只需要輸入之前自定義的密鑰。所以,它不會影響用于生成水印的執(zhí)行時間。
4.2.6 彈性
在數(shù)據(jù)結(jié)構(gòu)水印中,當且僅當程序的控制流達到程序的特定運行狀態(tài)時,水印被作為一種數(shù)據(jù)結(jié)構(gòu)的形式嵌入。因為水印沒有公開給用戶或開發(fā)人員,如果程序的控制流沒有達到特定的狀態(tài),水印很難被發(fā)現(xiàn)。所以,水印在面對程序的修改或混淆時需要具有彈性,在復活節(jié)彩蛋水印中,水印對用戶是公開的,它可以很容易的通過代碼分析被發(fā)現(xiàn)。所以,水印可以直接被用戶的修改所影響。
5 結(jié)論
軟件版權(quán)保護的研究也越來越多。在這篇文章中,我們介紹了軟件水印方法的概念,它可以通過在軟件發(fā)布之前嵌入水印的方式來確保軟件的版權(quán)。我們還提出了一些靜態(tài)軟件水印和動態(tài)軟件水印方法,不同的軟件水印在軟件代碼或軟件執(zhí)行時擁有不同的特性。
在本文中,我們介紹了軟件水印的性能評價指標。然后,我們對每種軟件水印的特性做了比較。一般來說,靜態(tài)軟件水印要比動態(tài)軟件水印更容易使用,這是因為靜態(tài)軟件水印不需要程序執(zhí)行,它是直接將水印信息嵌入到軟件代碼中。所以,水印很容易通過代碼分析被發(fā)現(xiàn)并刪除。然而,動態(tài)軟件水印是很難被用戶或開發(fā)人員發(fā)現(xiàn)的,因為水印是包含在運行程序的執(zhí)行狀態(tài)中。因此,它需要嵌入額外的代碼來生成運行時水印。此外,動態(tài)水印的方法還需要額外的開銷用于保存嵌入的水印。為了讓軟件水印能夠真正應用到軟件中,根據(jù)個人執(zhí)行環(huán)境以及軟件的特性對軟件水印的優(yōu)化就顯得尤為重要。在未來,預計軟件水印的方法將被應用在各種環(huán)境下的軟件保護和檢測軟件版權(quán)的侵權(quán)案件中。
參考文獻:
[1] 張立和,楊義先,鈕心忻,等.軟件水印綜述[J].軟件學報,2003,14(2):268-277.
[2] AKITO M,HAJIMUI,KEN-ICHI M,et al.Apractical method for waterm arking Java programs. Proceedings of the24th Computer Software and Applications Conference,2000.
[3] SHIRALI-SHAHREZA M,SHIRALI-SHAHREZA S.Software wa-termarking by equation reordering. ICTTA08: Proceedings of the3rd IEEE International Conference on Information&Communication Technologies:from Theory to Applications,2008.
[4] 蔣華,沙宗魯,軒愛成.基于表達式逆序數(shù)的軟件水印算法,2009,9(6):3189-3190.
[5] 周亮.軟件水印算法評估研究[D].吉林:吉林大學,2010.
[6] 崔孝晨.軟件加密與解密[M].人民郵電出版社,2012,378-488.
[7] Christian S C, Ginger M,Andrew H Sandmark-A Tool for software Protection Research[J].IEEE Security & Privacy.2003,1(4):40-49.
[8] 湯戰(zhàn)勇,房鼎益,蘇琳.一種基于代碼加密的防篡改軟件水印方案.中國科學技術(shù)大學學報,2011,41(7):599-606.