1. 程式人生 > >利用YUI compressor將JavaScript與html一起混淆

利用YUI compressor將JavaScript與html一起混淆

用JS+HTML寫的程式,在釋出時一般都需要進行混淆以保護程式碼。最近剛好遇到類似問題,就在網上找了幾個混淆工具來測試。其中我覺得效果最好的應該是jasob,能同時混淆HTML、CSS和JS,混淆完後真是所有內容都沒眼看,效果著實不錯,不過這傢伙要收費,一個開發就要130美刀,我的程式不是大工程,顯然不值得花這個錢了。另外有一個叫Javascript Obfuscator的也不錯,不過它也收費,同時也不支援同時混淆HTML。這中間還找到一個號稱能把HTML加密成JS指令碼的,但其實簡單除錯一下就能把指令碼執行結果解出來,沒什麼用處。最後決定還是用YUI這個免費的Compressor。

YUI Compressor的下載和使用可參考其主頁地址:

https://github.com/yui/yuicompressor。它混淆JS的效果還行,但它也不支援同時混淆html,它還會保留JS的函式和全域性變數,因為html中會呼叫它們。這樣僅混淆區域性變數名,所有函式名都保留顯然是不夠的,正常人一眼就能看出某個函式是幹啥用的,而其實函式名才是我們想要混淆的主要目標。當然,YUI還會壓縮空格把回車換行去掉等,但這些東西利用WEBSTORM之類的工具一下就能格式化回來,作用不大。

下面是YUI混淆前後的對比:

混淆前:

混淆後壓縮成了一行,但主要函式名和變數名仍能一眼看出來:

用格式化工具格式化一下就更明顯了:

為了解決這個問題,我又發揚了自己動手的折騰傳統,寫了一個程式來配置YUI Compressor,查詢專案下所有HTML和JS中的全域性函式和變數名,查詢可通過正則表示式進行,先對這些函式名和全域性變數名進行隨機替換,替換完成後再用YUI進行混淆,達到了較好的混淆效果。

執行替換後,區域性變數名還在,但函式名和全域性變數名已經很難看了:

再用YUI混淆後格式化,就連區域性變數都沒有了:

這個就基本上已經看不出什麼道道來了,增強了YUI混淆的效果。因為我們同時替換了所有HTML和JS,因此我們並不擔心函式和全域性變數被其它地方引用了。實現原理較簡單,大家可以試試。這個工具目前還比較簡陋難用,暫時就不放出來了,以後有空再整理下。