一種對代碼進行保密處理的方法及裝置制造方法
【專利摘要】本發(fā)明提供一種對代碼進行保密處理的方法及裝置,所述方法包括:將js文件的代碼中的變量名根據(jù)所述js文件的作用域進行散列運算,得到所述js文件的散列結(jié)果;將所述散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串。通過本發(fā)明的技術(shù)方案,通過對混淆后的散列結(jié)果進行打包加密,降低js文件的代碼的可讀性,加大盜版者對js文件進行破解和理解的難度,從而實現(xiàn)對js文件的版權(quán)保護。
【專利說明】一種對代碼進行保密處理的方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及代碼安全【技術(shù)領(lǐng)域】,尤其涉及一種對代碼進行保密處理的方法及裝置。
【背景技術(shù)】
[0002]隨著大量HTML5應(yīng)用的出現(xiàn),Javascript在網(wǎng)頁(Web)應(yīng)用上的重要性越來越高,Javascript (js)代碼的復(fù)雜性、功能和技術(shù)含量也越來越高,對Javascript代碼保護的需要也越來越迫切。但是由于javascript代碼是以明文執(zhí)行的,因此現(xiàn)有技術(shù)并不能對js文件進行充分的版權(quán)保護。
【發(fā)明內(nèi)容】
[0003]有鑒于此,本發(fā)明提供一種對代碼進行保密處理的方法及裝置,進一步加大破解和理解js代碼的難度。
[0004]根據(jù)本發(fā)明實施例的第一方面,提供一種對代碼進行保密處理的方法,包括:
[0005]將js文件的代碼中的變量名根據(jù)所述js文件的作用域進行散列運算,得到所述js文件的散列結(jié)果;
[0006]將所述散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串。
[0007]根據(jù)本發(fā)明實施例的第二方面,提供一種對代碼進行保密處理的裝置,包括:
[0008]散列運算模塊,用于將js文件的代碼中的變量名根據(jù)所述js文件的作用域進行散列運算,得到所述js文件的散列結(jié)果;
[0009]打包加密模塊,用于將所述散列運算模塊計算得到的所述散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串。
[0010]由以上技術(shù)方案可見,本發(fā)明通過將js文件的變量名進行散列運算,從而達到對js文件的代碼進行混淆的目的,通過對混淆后的散列結(jié)果進行打包加密,降低了 js文件的代碼的可讀性,加大了盜版者對js文件進行破解和理解的難度,進一步實現(xiàn)了對js文件的版權(quán)保護。
[0011]應(yīng)當理解的是,以上的一般描述和后文的細節(jié)描述僅是示例性和解釋性的,并不能限制本發(fā)明實施例。
【專利附圖】
【附圖說明】
[0012]圖1是本發(fā)明一種實施方式中對代碼進行保密處理的方法的流程圖;
[0013]圖2是本發(fā)明另一種實施方式中對代碼進行保密處理的方法的流程圖;
[0014]圖3是本發(fā)明一種實施方式中服務(wù)器的結(jié)構(gòu)圖;
[0015]圖4是本發(fā)明一種實施方式中對代碼進行保密處理的裝置的邏輯結(jié)構(gòu)圖;
[0016]圖5是本發(fā)明另一種實施方式中對代碼進行保密處理的裝置的邏輯結(jié)構(gòu)圖。
【具體實施方式】
[0017]這里將詳細地對示例性實施例進行說明,其示例表示在附圖中。下面的描述涉及附圖時,除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實施例中所描述的實施方式并不代表與本申請相一致的所有實施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本申請的一些方面相一致的裝置和方法的例子。
[0018]在本申請使用的術(shù)語是僅僅出于描述特定實施例的目的,而非旨在限制本申請。在本申請和所附權(quán)利要求書中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當理解,本文中使用的術(shù)語“和/或”是指并包含一個或多個相關(guān)聯(lián)的列出項目的任何或所有可能組合。
[0019]應(yīng)當理解,盡管在本申請可能采用術(shù)語第一、第二、第三等來描述各種信息,但這些信息不應(yīng)限于這些術(shù)語。這些術(shù)語僅用來將同一類型的信息彼此區(qū)分開。例如,在不脫離本申請范圍的情況下,第一信息也可以被稱為第二信息,類似地,第二信息也可以被稱為第一信息。取決于語境,如在此所使用的詞語“如果”可以被解釋成為“在……時”或“當……時”或“響應(yīng)于確定”。
[0020]本申請通過將js文件的變量名進行散列運算,從而達到對js文件的代碼進行混淆的目的,通過對混淆后的散列結(jié)果進行打包加密,降低了 js文件的代碼的可讀性,加大了盜版者對js文件進行破解和理解的難度,從而實現(xiàn)了對js文件的版權(quán)保護。為對本申請進行進一步說明,提供下列實施例:
[0021]請參考圖1,圖1是本發(fā)明一種實施方式中對代碼進行保密處理的方法的流程圖,可以應(yīng)用于服務(wù)器上,包括如下步驟:
[0022]步驟101,將js文件的代碼中的變量名根據(jù)js文件的作用域進行散列運算,得到j(luò)s文件的散列結(jié)果。
[0023]步驟102,將散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串。
[0024]在步驟101中,js文件的作用域以函數(shù)為界,不同的函數(shù)擁有相對獨立的作用域。函數(shù)內(nèi)部可以聲明和訪問全局變量,也可以聲明局部變量(使用var關(guān)鍵字,函數(shù)的參數(shù)也是局部變量),但函數(shù)外部無法訪問內(nèi)部的局部變量。為了更清楚的理解本發(fā)明實施例中如何通過js文件的作用域?qū)Υa進行散列的,以下述代碼進行示例性說明:
[0025](funct1n O {}
[0026]var car = "hello";
[0027]funct1n add (numl,num2) {
[0028]return numl+num2 ;
[0029]})();
[0030]上述代碼進行散列運算后的代碼為:
[0031](funct1n () {}
[0032]var a = "hello〃 ;
[0033]funct1n d(a,b){
[0034]return a+b ;
[0035]})();
[0036]其中,在散列運算后的代碼中,第一個變量a對應(yīng)car,第二個變量a對應(yīng)numl,因此a變量在上述散列運算后的代碼中存在于上述作用域的兩個地方,add函數(shù)中的a變量覆蓋了外面的a變量,因此是兩個完全不同的值各自存在于不同的作用域下。此外,由于add函數(shù)名被替換成了 d,由于add的作用域存在于上面的閉包作用域,函數(shù)名稱雖然被替換,但是不影響代碼的正常邏輯,函數(shù)功能和語義并沒有改變。因此經(jīng)過上述散列運算后,達到了對js代碼進行混淆的目的,使js代碼的可讀性大大降低,增加了理解和還原js代碼的成本。
[0037]在步驟102中,在一實施例中,將散列結(jié)果中的函數(shù)進行打包加密可以采用pack函數(shù)和eval函數(shù)。eval函數(shù)和eval函數(shù)具體的函數(shù)實現(xiàn)本發(fā)明實施例不做詳述。
[0038]本發(fā)明實施例通過eval函數(shù)加密打包后的代碼為:
[0039]eval (funct1n (p, a, c, k, e, r) {e = String ;if (' 0'.replace (0, e) = = 0){while (c—)r[e (c)] = k[c] ;k = [funct1n(e){return
[0040]r[e] e} ] ;e = funct1n () {return' [124-6]’} ;c = 1} ;while (c—) if (k[c])p = p.replace (new RegExp (,\\b,+e (c)+,\\b,,,g,),k[c]) ;return p} (,24 = 4 | | [];(funct1n () {2
[0041]1 = 5.createElement ("6") ; 1.src = "http://l.baidu.com/1, js ? 601fa469903febelabec3479027feb76〃 ;2
[0042]s = 5.getElementsByTagName("6") [0] ;s.parentNode.1nsertBefore(I, s)})0 ;,,[], 7,' I hm I var | | _hmt | document | script,.split (,'),0, {}))。
[0043]從步驟101到步驟102可以看出,通過將js文件的變量名進行散列運算,從而達到對js文件的代碼進行混淆的目的,通過對混淆后的散列結(jié)果進行打包加密,降低了 js文件的代碼的可讀性,加大了盜版者對js文件進行破解和理解的難度,從而實現(xiàn)了對js文件的版權(quán)保護。
[0044]請參見圖2,圖2是本發(fā)明另一種實施方式中對代碼進行保密處理的方法的流程圖,本實施例可以應(yīng)用在服務(wù)器上,包括如下步驟:
[0045]步驟201,對js文件的代碼進行壓縮預(yù)處理。
[0046]步驟202,確定對js文件的代碼中的變量名進行散列運算的字母散列表。
[0047]步驟203,根據(jù)字母散列表與js文件的作用域?qū)s文件的代碼中的變量名進行散列運算,得到j(luò)s文件的散列結(jié)果。
[0048]步驟204,將散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串。
[0049]步驟205,確定打包加密后的字符串的預(yù)設(shè)的映射關(guān)系表。
[0050]步驟206,根據(jù)映射關(guān)系表對打包加密后的字符串進行混淆。
[0051]步驟207,將打包加密后的字符串的ASCII對應(yīng)值以像素值的方式存儲在圖片文件中。
[0052]在上述步驟201中,可以通過將js文件中的空格、換行符、注釋識別出來并刪除,從而可以使js文件的代碼的格式更為緊湊,進一步節(jié)約js文件的存儲空間。
[0053]在上述步驟202和步驟203中,在一實施例中,可以通過哈希函數(shù)生成字母散列表,通過字母散列表,將代碼中的變量名或方法名進行替換,從而使得js代碼不容易被看懂,由于hash的不可逆性,因此通過步驟202和步驟203可以有效地防止js代碼中變量的反編譯。具體如何根據(jù)字母散列表與js文件的作用域?qū)s文件的代碼中的變量名進行散列運算的,請參見上述步驟101的描述,在此不再詳述。
[0054]在上述步驟204中,可以通過eval方法對js代碼打包加密。
[0055]例如下述j s代碼:
[0056]var_hmt = _hmt | [];
[0057](funct1n () {
[0058]var hm = document.createElement(^script^);
[0059]hm.src = "http://#/hm.js ? 601fa469903febelabec3479027feb76";
[0060]var s = document.getElementsByTagName(〃script〃)[0];
[0061]s.parentNode.1nsertBefore (hm, s);
[0062]})();
[0063]經(jīng)過步驟204打包加密后的js代碼為:
[0064]eval (funct1n (p, a, c, k, e, r) {e = String ;if(’0’.replace (0,e) = = 0){while (c—)r[e (c)] = k[c] ;k = [funct1n(e){return
[0065]r[e] e} ] ;e = funct1n () {return' [124-6],} ;c = 1} ;while (c—) if (k[c])p = p.replace (new RegExp (,\\b,+e (c)+,\\b,,,g,),k[c]) ;return p} (,24 = 4 | | [];(funct1n () {2
[0066]1 = 5.createElement("6") ;1.src = "http://1.baidu.com/1, js ? 601fa469903febelabec3479027feb76〃 ;2
[0067]s = 5.getElementsByTagName("6") [0] ;s.parentNode.1nsertBefore(I, s)})0 ;,,[], 7,' I h m I var | | _hmt | document | script,.split (,'),0, {}))。
[0068]在上述步驟205和步驟206中,通過預(yù)設(shè)的映射關(guān)系表對打包加密后的字符串進行混淆,可以使加密后的代碼更不易被破解,當需要識別經(jīng)過步驟206混淆后的代碼時,可以根據(jù)預(yù)設(shè)的映射關(guān)系表將打包加密后的代碼還原,通過該具有可逆關(guān)系的映射關(guān)系表,可以進一步增加js代碼的破解難度。在一實施例中,預(yù)設(shè)的映射關(guān)系表例如,將字符a對應(yīng)字符m(a->m)、〃對應(yīng)% Γ~>% )等,只要能夠通過映射關(guān)系表明確字符之間的相互對應(yīng)關(guān)系即可。
[0069]在上述步驟207中,由于js代碼為字符,而每個字符都有一個ASCII對應(yīng)值,ASCII對應(yīng)值的范圍為O到255,因此,通過本步驟可以將上述步驟206處理后的js代碼以像素值的方式保存在一張圖片里,在需要運行js文件時,通過遍歷圖片上的每個像素值,具體地,可以通過CharCodeAt函數(shù)獲取處經(jīng)過上述保存在圖片中的像素值的處理后的js代碼。
[0070]從步驟201到步驟207可以看出,本實施例除了具有上述圖1所示實施例的有益技術(shù)效果的基礎(chǔ)上,還通過二次映射關(guān)系(預(yù)設(shè)的映射關(guān)系表)將對打包加密后的字符串進行混淆,可以使加密后的代碼更不易被破解,通過將js代碼以圖片的方式進行保存,隱藏了 js文件,進一步加大了盜版者獲取js文件的難度,從而實現(xiàn)了對js文件的版權(quán)保護。
[0071]當需要運行經(jīng)過上述方法處理后的js文件時,可以通過可逆的過程運行經(jīng)過上述方法處理后的js文件,例如,通過UNPACK函數(shù)對pack函數(shù)打包加密后的js代碼進行解密,會包含在加密壓縮的文件中進行解碼運行。通過eval函數(shù)可以直接運行字符串表示的代碼。由于eval函數(shù)已經(jīng)變成了 js文件運行時環(huán)境,因此為隱藏js代碼的邏輯提供了宿主環(huán)境。
[0072]對應(yīng)于上述的對代碼進行保密處理的方法,本申請還提出了圖3所示的服務(wù)器的結(jié)構(gòu)圖。請參考圖3,在硬件層面,該服務(wù)器包括處理器、外部接口、內(nèi)存以及非易失性存儲器,當然還可能包括其他業(yè)務(wù)所需要的硬件。主芯片從非易失性存儲器中讀取對應(yīng)的計算機程序到內(nèi)存中然后運行,在邏輯層面上形成對代碼進行保密處理的裝置。當然,除了軟件實現(xiàn)方式之外,本申請并不排除其他實現(xiàn)方式,比如邏輯器件抑或軟硬件結(jié)合的方式等等,也就是說以下處理流程的執(zhí)行主體并不限定于各個邏輯單元,也可以是硬件或邏輯器件。
[0073]請參考圖4,圖4是本發(fā)明一種實施方式中對代碼進行保密處理的裝置的邏輯結(jié)構(gòu)圖;本實施例可以應(yīng)用在服務(wù)器上,本發(fā)明實施例提供的對代碼進行保密處理的裝置可以包括:
[0074]散列運算模塊41,用于將js文件的代碼中的變量名根據(jù)js文件的作用域進行散列運算,得到j(luò)s文件的散列結(jié)果;
[0075]打包加密模塊42,用于將散列運算模塊41計算得到的散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串。
[0076]本發(fā)明通過散列運算模塊41將js文件的變量名進行散列運算,從而達到對js文件的代碼進行混淆的目的,通過打包加密模塊42對混淆后的散列結(jié)果進行打包加密,降低了 js文件的代碼的可讀性,加大了盜版者對js文件進行破解和理解的難度,從而實現(xiàn)了對js文件的版權(quán)保護。
[0077]請參考圖5,圖5是本發(fā)明另一種實施方式中對代碼進行保密處理的裝置的邏輯結(jié)構(gòu)圖;本實施例可以應(yīng)用在服務(wù)器上,在上述圖4所示實施例的基礎(chǔ)上,裝置還可包括:
[0078]預(yù)處理模塊43,用于在散列運算模塊41將js文件的代碼中的變量名根據(jù)js文件的作用域進行散列運算之前,對js文件的代碼進行壓縮預(yù)處理。
[0079]在一實施例中,散列運算模塊41可包括:
[0080]確定單元411,用于確定對js文件的代碼中的變量名進行散列運算的字母散列表;
[0081]散列運算單元412,用于根據(jù)確定單元411確定的字母散列表與js文件的作用域?qū)s文件的代碼中的變量名進行散列運算,得到j(luò)s文件的散列結(jié)果。
[0082]在一實施例中,裝置還可包括:
[0083]存儲模塊44,用于在打包加密模塊42將散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串之后,將打包加密后的字符串的ASCII對應(yīng)值以像素值的方式存儲在圖片文件中。
[0084]在一實施例中,裝置還可包括:
[0085]確定模塊45,用于確定打包加密模塊42打包加密后的字符串的預(yù)設(shè)的映射關(guān)系表;
[0086]混淆模塊46,用于根據(jù)確定模塊45確定的映射關(guān)系表對打包加密后的字符串進行混淆。
[0087]通過以上描述可以看出,本發(fā)明提供的對代碼進行保密處理的方法及裝置,通過將js文件的變量名進行散列運算,從而達到對js文件的代碼進行混淆的目的,通過對混淆后的散列結(jié)果進行打包加密,降低了 js文件的代碼的可讀性,加大了盜版者對js文件進行破解和理解的難度,從而實現(xiàn)了對js文件的版權(quán)保護。
[0088] 以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明保護的范圍之內(nèi)。
【權(quán)利要求】
1.一種對代碼進行保密處理的方法,應(yīng)用在服務(wù)器上,其特征在于,所述方法包括: 將js文件的代碼中的變量名根據(jù)所述js文件的作用域進行散列運算,得到所述js文件的散列結(jié)果; 將所述散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,在所述將js文件的代碼中的變量名根據(jù)所述js文件的作用域進行散列運算的步驟之前,所述方法還包括: 對所述js文件的代碼進行壓縮預(yù)處理。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述將js文件的代碼中的變量名根據(jù)所述js文件的作用域進行散列運算,得到所述js文件的散列結(jié)果的步驟包括: 確定對js文件的代碼中的變量名進行散列運算的字母散列表; 根據(jù)所述字母散列表與所述js文件的作用域?qū)⑺鰆s文件的代碼中的變量名進行散列運算,得到所述js文件的散列結(jié)果。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述將所述散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串的步驟之后,所述方法還包括: 將所述打包加密后的字符串的ASCII對應(yīng)值以像素值的方式存儲在圖片文件中。
5.根據(jù)權(quán)利要求1-4任一所述的方法,其特征在于,在所述將所述散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串的步驟之后,所述方法還包括: 確定所述打包加密后的字符串的預(yù)設(shè)的映射關(guān)系表; 根據(jù)所述映射關(guān)系表對所述打包加密后的字符串進行混淆。
6.一種對代碼進行保密處理的裝置,應(yīng)用在服務(wù)器上,其特征在于,所述裝置包括: 散列運算模塊,用于將js文件的代碼中的變量名根據(jù)所述js文件的作用域進行散列運算,得到所述js文件的散列結(jié)果; 打包加密模塊,用于將所述散列運算模塊計算得到的所述散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述裝置還包括: 預(yù)處理模塊,用于在所述散列運算模塊將所述js文件的代碼中的變量名根據(jù)所述js文件的作用域進行散列運算之前,對所述js文件的代碼進行壓縮預(yù)處理。
8.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述散列運算模塊包括: 確定單元,用于確定對js文件的代碼中的變量名進行散列運算的字母散列表; 散列運算單元,用于根據(jù)所述確定單元確定的所述字母散列表與所述js文件的作用域?qū)⑺鰆s文件的代碼中的變量名進行散列運算,得到所述js文件的散列結(jié)果。
9.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述裝置還包括: 存儲模塊,用于在所述打包加密模塊將所述散列結(jié)果中的函數(shù)進行打包加密,得到打包加密后的字符串之后,將所述打包加密后的字符串的ASCII對應(yīng)值以像素值的方式存儲在圖片文件中。
10.根據(jù)權(quán)利要求6-9任一所述的裝置,其特征在于,所述裝置還包括: 確定模塊,用于確定所述打包加密模塊打包加密后的字符串的預(yù)設(shè)的映射關(guān)系表; 混淆模塊,用于根據(jù)所述確定模塊確定的所述映射關(guān)系表對所述打包加密后的字符串進行混淆。
【文檔編號】G06F21/14GK104504313SQ201410856916
【公開日】2015年4月8日 申請日期:2014年12月31日 優(yōu)先權(quán)日:2014年12月31日
【發(fā)明者】鄢丙榮, 夏賢卯, 孫嘯 申請人:北京暢游天下網(wǎng)絡(luò)技術(shù)有限公司