999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Java軟件保護方案的設計和實現

2018-12-22 14:46:55龔少麟
計算機時代 2018年5期
關鍵詞:程序

龔少麟

(中國電子科技集團公司第二十八研究所,江蘇 南京 210007)

0 引言

Java是一種跨平臺的解釋型語言,由于跨平臺的需求,Java的指令集比較簡單而通用,較容易得出程序的語義信息。Java編譯器將每一個類編譯成一個單獨的文件,這也簡化了反編譯的工作[1]。Java源代碼編譯中間“字節碼”存儲于Class文件中。Class文件是一種字節碼形式的中間代碼,該字節碼中仍然保留所有的方法名稱、變量名稱,并且通過這些名稱來訪問變量和方法,這些符號往往帶有許多語義信息。由于Java程序自身的特點,對于不經過處理的Java程序,反編譯的效果非常好。

目前,市場上有許多Java的反編譯工具,這些工具的反編譯速度和效果都很不錯。好的反編譯軟件,能夠反編譯出非常接近源代碼的程序。通過反編譯器,黑客能夠對這些程序進行更改,或者復用其中的程序。因此,如何保護Java程序不被反編譯,是非常重要的一個問題。此外,Java程序基于JVM這一“中間層”能夠在不同平臺上運行,真正實現了“一次編譯,到處運行”的目的。Java的這一特性對商業軟件的版權保護也帶來了挑戰。

1 常見保護技術對比

1.1 源文件保護

目前針對Java源文件方法主要有本地編譯、數字水印、ClassLoader加密,以及代碼混淆技術。

⑴ 本地編譯

Java本地編譯[2]是指將Java應用程序編譯成本地應用程序,如Windows平臺下名為exe的應用程序。通過java虛擬機將源代碼生成Java類文件,再將類文件編譯成可執行文件。用該技術生成的本地應用程序是二進制格式的可執行文件,但該方法犧牲了Java的跨平臺特性,對于桌面應用程序的開發問題不大,但是對于Web應用程序的開發,則是一個致命缺陷。同時該方法技術層面還存在不成熟,支持不完善的問題,不適合采用。

⑵ 數字水印

數字水印技術[3]是將一些標識信息(即數字水印)直接嵌入數字載體(包括多媒體、文檔、軟件等)當中,但不影響原載體的使用價值,也不容易被人的知覺系統覺察或注意到。通過這些隱藏在載體中的信息,可以達到確認內容創建者、購買者、傳送隱秘信息或者判斷載體是否被篡改等目的。在需要證明程序是否非法使用時,數字水印就變得很重要。使用水印技術并不能阻止類文件被反編譯,但是可以在需要確認某些程序是否屬于剽竊時提供有效證據。

⑶ ClassLoader加密

ClassLoader的基本目標是對類的請求提供服務。當JVM 需要使用類時,它根據名稱向ClassLoader請求這個類,然后ClassLoader試圖返回一個表示這個類的Class對象。通過覆蓋對應于這個過程不同階段的方法,可以創建定制的ClassLoader。在裝入原始數據后先進行解密,再轉換成Class對象。由于把原始字節碼轉換成Class對象的過程完全由系統負責,因此只需先獲得原始數據,接著就可以進行包含解密在內的任何轉換。這種方案比其他方案更加安全,然而這種加密方法存在一個漏洞,由于ClassLoader的類是用Java編寫的,如果對ClassLoader類進行反編譯,提取其中解密算法,就可解密所有被加密的其他類。

⑷ 代碼混淆

代碼混淆[4]是將計算機程序的代碼,轉換成一種功能上等價,但是難于閱讀和理解的形式的行為。代碼混淆可以用于程序源代碼,也可以用于程序編譯而成的中間代碼。代碼混淆技術其本質上是類文件模糊技術,處理以后的類文件功能和處理以前的類文件功能在邏輯上是等同的,即運行后能夠得到一樣的輸出結果。但是,經過測試發現目前市面上的一些代碼混淆工具實際效果并不好,使用一些反編譯工具仍然可以輕易地看到源碼。

1.2 軟件授權

一般商用軟件的授權方式分為3種:序列號、聯網認證、授權碼[5]。

⑴ 序列號方式是最常見的軟件授權方式,也為絕大多數商用軟件所采用,它的安全性最低,最容易盜版,但這類軟件大多為通用型軟件,有廣大的用戶群,廠商依然能獲得足夠的利潤。多為桌面系統軟件所采用。

⑵ 聯網認證則是隨著互聯網的飛速發展,而出現的新型軟件授權方式,已經在Microsoft和Adobe等廠商的產品中得到廣泛應用,首先要開發一個客戶端驗證軟件,其次還要架設專門的提供驗證授權服務的網站,從技術成本和資金成本上來講,都不適合中小軟件公司;也不適用于專用性較強,用戶群較小的軟件。

⑶ 授權碼。程序獲得運行機的惟一標識(如:網卡硬件地址、CPU ID序列號、硬盤序列號等);程序將獲得的惟一標識加密(可靈活選用各種加密算法進行加密),然后由用戶或者程序自動將加密后的標識作為申請碼發送給軟件的開發方;開發者將加密后的惟一標識解密,然后開發者再將惟一標識加密作為授權碼發送給客戶注冊;客戶將開發者發送的授權碼進行注冊解密,解密后的內容其實就是:惟一標識;每當程序啟動,首先解密已獲取的授權碼,然后讀取網卡硬件地址、CPU ID序列號、硬盤序列號等,進行驗證,比較兩個標識是否一致。如果經比較一致,則認為是合法授權安裝,程序正常啟動;如果不一致,則認為是非法授權安裝,程序停止啟動。

2 軟件保護方案設計

2.1 方案設計

源文件保護和軟件授權是軟件保護需要解決的兩大問題。考慮使用軟件運行機器的惟一標識作為源文件加/解密的密鑰,既可以實現對源文件的保護,又能達到軟件和運行機器綁定,防止軟件被隨意復制擴散。基于此思路,本方案基于軟件運行機器的惟一標識進行變換后作為加密的密鑰,對核心文件進行加密保護。在Web工程啟動時,程序同樣基于軟件運行機器的惟一標識進行變換后作為解密的密鑰啟動解密功能模塊。如果解密正確則表示軟件已被授權,Web工程可以正常啟動,否則中斷啟動程序并提示。整個軟件保護流程如下。

⑴ 密鑰生成

首先,獲取軟件運行機器的惟一標識(如:CPU序列號、硬盤序列號、MAC序列號等)。由于使用工具可以偽造MAC序列號,這里我們選擇使用CPU序列號、硬盤序列號的組合作為軟件運行機器的惟一標識I。為了增強軟件保護方案的安全性,將CPU序列號、硬盤序列號、用戶信息等,按自定義的規則進行組合,以滿足密鑰的不可知性。

I=F(CPU序列號,硬盤序列號,用戶信息)

使用散列函數對軟件運行機器的惟一標識信息進行數學運算,生成符合加密算法要求的密鑰K。MD5即Message-Digest Algorithm 5(信息-摘要算法5),是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法)。MD5的作用是以任意長度的信息作為輸入進行計算,產生一個128-bit(16-byte)的指紋或報文摘要。對惟一標識I進行MD5計算后得到一個128位摘要信息,作為加密算法的密鑰K。

K=Hash(I)

⑵ 加密解密

常用的加密算法有對稱加密和非對稱加密兩大類型[6],對稱加密指加密和解密使用相同密鑰的加密算法。對稱加密算法的特點是算法公開、計算量小、加密速度快、加密效率高。具體算法包括DES、3DES、AES等算法。非對稱加密算法需要公開密鑰和私有密鑰兩個密鑰。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密,主要算法包括RSA、Elgamal、ECC等。非對稱加密算法主要用于數字簽名和密鑰的加密傳輸,加密速度也比對稱加密算法慢,本方案使用AES加密算法來加密工程源文件,并將源文件加密過程編譯成一個獨立的可執行程序。

在實際使用中也可以根據需要選擇其他加密強度更高的對稱加密算法。AES在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。AES加密數據塊分組長度必須為128bit,密鑰長度可以是128比特、192比特、256比特中的任意一個。上一步得到的密鑰長度為128bit,滿足AES加密算法的要求。為了提高加密效率,只選擇工程中部分核心源文件進行加密,使用密鑰K對文件進行加密計算,最終得到經過加密的文件。

由于我們使用的是對稱加密算法,加密密鑰和解密密鑰是相同的,因此解密密鑰的獲取方法和第一步相同。使用AES解密算法對核心源文件進行解密,若解密正確則可得到正確的源文件,Java工程可以正常啟動運行。為了保證解密過程不被破解,將解密過程封裝在C++動態庫中,由Java調用動態庫中的解密方法獲得源文件[7]。

⑶ 啟動驗證方案需要在Java程序啟動時對加密的源文件進行解密。JVM每次裝入類文件時都需要一個稱為ClassLoader的對象,這個對象負責把新的類裝入正在運行的JVM[8]。JVM給ClassLoader一個包含了待裝入類(比如java.lang.Object)名字的字符串,然后由ClassLoader負責找到類文件,裝入原始數據,并把它轉換成一個Class對象。因此按照規則編寫自定義的ClassLoader進行解密,這樣我們就可以在程序中加載特定的類,并且這個類只能被我們自定義的加載器來進行加載,提高了程序的安全性。

2.2 可行性分析

⑴ 源文件保護

本方案將程序的核心源文件通過對稱加密,轉換為不可執行的、不可反編譯的亂碼。加密解密密鑰是基于軟件運行機器的惟一標識,使用散列函數計算得到。密鑰具有以下特點:由于密鑰是將CPU序列號、硬盤序列號、用戶信息按自定義的規則進行組合計算得到,而破解者不知道添加的用戶信息和組合規則,因此破解者無法計算出密鑰結果;本方案將解密過程封裝在動態庫中,由Java啟動程序調用動態庫執行源文件解密過程,由于動態庫是二進制文件,所以很難通過反編譯得到解密算法。Java運行時裝入字節碼的機制隱含地意味著可以對字節碼進行修改。在這里,它的用途是在類文件裝入之時進行解密,因此可以看成是一種即時解密器。由于解密后的字節碼文件永遠不會保存到文件系統,所以竊密者很難得到解密后的代碼。因此,依賴本方案中加密解密密鑰的這些特點,可以有效地保證源文件的安全性。

⑵ 軟件授權

本方案將密鑰的計算和軟件運行機器的CPU序列號、硬盤序列號進行了綁定,由于每臺機器的密鑰都是不一樣,保證了只有在指定的機器上運行軟件才能計算獲得正確的解密密鑰,從而解密源文件使Web工程正常運行。由于密鑰的計算中加入了用戶信息和組合規則,確保破解者無法計算出密鑰。而且一旦軟件被人破解,開發者無需對軟件做過多改動,只需更改獲取密鑰中的用戶信息和組合規則,再變換加密算法,即可應對破解,這對于投入高、用戶群小、專業性強的軟件是最優選擇。

3 具體實現

3.1 密鑰生成

⑴ 獲取軟件運行機器的惟一標識

在給軟件加序列號時,CPU序列號、硬盤序列號這兩個參數是最有用的,可以實現序列號和機器綁定。這些信息可以在.NET下通過WMI非常方便的查詢得到。WMI非常強大,可以查詢電腦中各種信息。查詢的方式是WQL,和SQL的語句差不多。采用C#語言編程實現此功能,并保存在文件中。

//獲取CPU序列號代碼

string cpuInfo="";

ManagementClass mc=new ManagementClass

("Win32_Processor");

ManagementObjectCollection moc=mc.GetInstances();

foreach(ManagementObject mo in moc)

{cpuInfo=mo.Properties["ProcessorId"].Value.ToString();

}

//獲取硬盤ID

string HDid="";

ManagementClass mc=new ManagementClass

("Win32_DiskDrive");

ManagementObjectCollection moc=mc.GetInstances();

foreach(ManagementObject mo in moc)

{HDid=(string)mo.Properties["Model"].Value;

}

⑵ 生成密鑰

本方案使用Crypto++庫來實現密鑰生成功能。首先在文件頭添加#pragma comment(lib,"cryptlib.lib")加載lib文件和頭文件md5.h。代碼如下,其中message為原始信息,len為message的長度。

MD5 md5;

byte digest[16];

md5.CalculateDigest(digest,message,len);

3.2 加密解密

⑴加密

源文件加密是一個獨立的可執行程序。在應用加密方法時要加四個頭文件 aes.h、hex.h、files.h和modes.h。加密函數void AESEncryptFile(const char*in,const char*out,const char*passPhrase)中參數in是要加密的文件名,out是要解密的文件名,passPhrase是密鑰。這個函數的基本流程為:用增量值iv和密鑰passPhrase創建一個AES加密的CFB工作模式對象aesEncryption。

void AESEncryptFile(const char *in,const char *out,

const char *passPhrase)//加密文件

{byte iv[AES::BLOCKSIZE]="123456";

AES::Encryption aesEncryption((byte*)passPhrase,

AES::DEFAULT_KEYLENGTH);

CFB_Mode_ExternalCipher::Encryption cfbEncryption

(aesEncryption,iv);

FileSource f(in,true,new StreamTransformationFilter

(cfbEncryption,new FileSink(out)));

}

⑵解密

解密算法被封裝在C++動態庫中,方便Java程序在啟動時調用。源文件解密同樣需要在應用解密函數時要加四個頭文件 aes.h、hex.h、files.h和modes.h,實現過程和加密類似,實現代碼如下:

//解密文件

void AESDecryptFile(const char *in,const char *out,

const char *passPhrase)//解密文件

{byte iv[AES::BLOCKSIZE]="123456";

CFB_Mode<AES >::Decryption cfbDecryption((byte *)

passPhrase,16,iv);

FileSource f(in,true,new StreamTransformationFilter

(cfbDecryption,new FileSink(out)));

}

3.3 程序啟動

按照規則編寫自定義的ClassLoader進行解密,這樣我們就可以在程序中加載特定的類,并且這個類只能被我們自定義的加載器進行加載。通過定制的loadClass,實現運行時動態解密并執行程序,一般實現這個方法的步驟是執行findLoadedClass(String)去檢測這個class是不是已經加載過了。執行父加載器的loadClass方法。如果父加載器為null,則jvm內置的加載器去替代,也就是Bootstrap ClassLoader。這也解釋了ExtClassLoader的parent為null,但仍然說Bootstrap ClassLoader是它的父加載器。如果向上委托父加載器沒有加載成功,則通過findClass(String)查找。如果class在上面的步驟中找到了,參數resolve又是true的話,那么loadClass()又會調用resolveClass(Class)這個方法來生成最終的Class對象。我們可以從源代碼看出這個步驟。

public Class loadClass(String name,boolean resolve)

throws ClassNotFoundException

{Class clasz=null;

clasz=findLoadedClass(name);

if(clasz!=null)

return clasz;

byte classData[]=Util.readFile(name+".class");

if(classData!=null){

byte decryptedClassData[]=cipher.doFinal

(classData);//解密

clasz=defineClass(name,decryptedClassData,0,

decryptedClassData.length);//再把它轉換成一個類

}

if(clasz==null)

clasz=findSystemClass(name);

if(resolve&&clasz!=null)

resolveClass(clasz);

return clasz;//把類返回給調用者

}

4 結束語

本文對現有的Java工程軟件保護機制進行了深入研究,分析了不同機制的優缺點及其適用場景,提出了一種新的Java軟件保護方案,并給出部分實現過程。該方案基于軟件運行機器的惟一標識碼,采用AES對稱加密算法對核心源文件加密,在實現對源文件保護的同時,也確保了軟件和運行機器的綁定,使其具有較高的防破解能力。即使軟件被破解,也可以通過更改獲取密鑰中的用戶信息和組合規則,再變換加密算法,輕松應對破解。現有Java Web工程大多基于開源框架,因此基于Spring框架如何實現ClassLoader的加載還需要進一步深入研究。

參考文獻(References):

[1]周建林.軟件保護技術研究與設計[D].華中科技大學碩士學位論文,2009.

[2]宋揚,李立新,周雁舟等.軟件防篡改技術研究[J].計算機安全,2009.1:34-37

[3]李勇,左志宏.目標代碼混淆技術綜述[J].計算機技術與發展,2007.17(4):68-71

[4]尹浩,林闖等.數字水印技術綜述[J].計算機技術與發展,2005.42(7):1093-1099

[5]王琴琴,郭師虹.軟件授權技術的研究[J].計算機技術與發展,2012.22(9):235-238

[6]張福泰,李繼國,王曉明等.密碼學教程[M].武漢大學出版社,2006.

[7]王銀江,凌力.JNI在安全加密系統效率改進中的應用[J].計算機工程,2004.30(12):99-100

[8]章敦華,劉建.Java動態類加載機制及其應用[J].計算機工程與設計,2004.25(3):432-435

猜你喜歡
程序
給Windows添加程序快速切換欄
電腦愛好者(2020年6期)2020-05-26 09:27:33
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
基于VMM的程序行為異常檢測
偵查實驗批準程序初探
我國刑事速裁程序的構建
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 欧美日韩国产在线人成app| 欧美一区中文字幕| 美女视频黄频a免费高清不卡| 国内精品九九久久久精品| 国产91丝袜在线播放动漫 | 中文字幕无码中文字幕有码在线| 国产女人18水真多毛片18精品| 久久免费看片| 青青青草国产| 国产99在线观看| 国产午夜福利在线小视频| 四虎亚洲精品| 91久久偷偷做嫩草影院| 中文字幕在线视频免费| 色久综合在线| 成人免费视频一区| 2018日日摸夜夜添狠狠躁| 国产美女精品一区二区| 91精品福利自产拍在线观看| Jizz国产色系免费| 国产亚洲欧美另类一区二区| 久久午夜影院| 91精品啪在线观看国产| 97se亚洲综合在线天天| 中文字幕av一区二区三区欲色| 伊人久综合| 亚洲国内精品自在自线官| 福利在线不卡| 国产美女91视频| 亚洲AV无码久久天堂| 亚洲天堂网在线视频| 亚洲妓女综合网995久久| 日韩精品欧美国产在线| 国产精品熟女亚洲AV麻豆| 麻豆AV网站免费进入| 亚洲精品免费网站| 欧美日韩免费| 丁香六月综合网| 亚洲天堂色色人体| 色哟哟国产成人精品| 亚洲精选高清无码| 天天做天天爱天天爽综合区| 国产无码制服丝袜| 在线a视频免费观看| 午夜精品区| 久久精品这里只有精99品| 婷婷亚洲天堂| 久久国产亚洲欧美日韩精品| 亚洲第一成网站| 天天摸夜夜操| jijzzizz老师出水喷水喷出| 国产第八页| 天天综合网色中文字幕| 中文字幕日韩欧美| 97国产精品视频自在拍| 国产黄色爱视频| 亚洲成在线观看| 日韩小视频网站hq| 亚洲精品国产成人7777| 在线看免费无码av天堂的| 999国内精品久久免费视频| 久久91精品牛牛| 99国产精品一区二区| 91色在线观看| 亚洲男人的天堂网| 亚洲无线观看| 免费毛片视频| 欧美色综合久久| 无码国产伊人| 亚洲欧美另类中文字幕| 狂欢视频在线观看不卡| 欧美成人第一页| 青青青草国产| 中文字幕亚洲另类天堂| 欧美不卡二区| 久久中文字幕av不卡一区二区| 丁香六月激情综合| 日韩一二三区视频精品| 少妇露出福利视频| 亚洲日本中文字幕天堂网| 亚洲精品欧美日本中文字幕| 91无码视频在线观看|