2011-08-25 81 views
5

我正在一個項目中,我們需要加密.jar文件,所以沒有人可以訪問.class文件裏面的jar文件....是否有任何Java編碼這可以幫助我加密.jar文件?如何加密.jar文件

回答

13

即使您對jar文件進行了加密,它在JVM能夠運行之前也必須解密,因此您需要另一個jar文件,其中包含可在JVM中解密和加載的類。

由於第二個jar文件本身不能加密,惡意用戶希望看到你的類文件,只需查看第二個jar文件中的類,然後解密你的超級機密jar文件並訪問它。

也許你可以使用混淆器來提高代碼的安全性,但它最終會保護(使它更難但不可能)你的類文件反編譯而不是被使用。

如果模糊不夠,你可以考慮將你的jar文件編譯爲一個windows或者一個用於unix/linux的SO,這會使得反編譯變得更加困難,但並不總是可以正確地做到這一點,它是通常是PITA。 GCJ能夠以某種方式做到這一點,還有其他商業產品將直接將.class/.jar編譯成機器碼。

但是,請考慮一下,放入多少安全並不重要,因爲客戶端計算機必須能夠執行它,它必須能夠讀取它,所以無論您的代碼將被暴露,您只能讓它變得更難。

如果你確實有一個如此祕密的算法,你不想透露任何內容,不妨考慮把它轉換成一個web服務,將它託管在你的服務器上,這樣你就不必將實際的代碼發送給客戶端機器,並且還可以通過檢查對其重要部分的訪問來更好地防止未經授權的應用程序副本。

+0

實際上我想要保護.class文件免於訪問.jar文件,您是否有辦法做到這一點? –

+0

AlexR的建議是使用自定義類加載器來即時解密jar文件,這是可行的,並且或多或少是你所要求的,但請記住,任何安裝了JAD的普通熟練程序員都可以無論如何反向工程你的自定義類加載器和訪問類。我用另一種解決方案添加了一個段落,但這很不尋常。 –

1

不需要。因爲您的程序需要能夠運行代碼,所以無論如何都沒有意義。

儘管如此反編譯.class文件導致可讀性較差的代碼(無意義的變量/類名稱等),但您可以對代碼進行混淆。

1

據我所知這不是標準的JVM支持。但是你可以做以下事情。將你的應用程序分成兩部分。首先不會被加密。這將是一個簡單的加載器,它將使用自定義類加載器來實例化其餘部分。這個類加載器將以字節數組的形式獲得類,解密並加載它們。

+0

雖然這是一些人使用的方法,但總有可能反編譯自定義類加載器並破壞安全性。就像你可以讀取解密的代碼一樣,你可以將它解密寫出來。 :) – carlspring

0

如果你不想提供對jar文件內類文件的訪問,爲什麼你應該提供你的jar與應用程序? 感覺就像你的問題在概念上有點錯...

如果你需要一些自定義的加載類的方式,可以考慮使用自定義類加載器。

+0

與什麼應用程序我可以提供我的.jar文件來保存.class文件從訪問側.jar文件? –

3

我假設您已經意識到,任何熟練的java編碼人員都可以對您使用(或寫入)的Java工具進行反向工程,並仍然解碼應用程序的jar包?也可以編寫自定義類加載器來讀取您的「加密」代碼,並且可以編寫一個工具來繞過它。

即使使用模糊處理和字節碼修改以及自定義類加載器,java也是可以被破解/可反編譯的,並且數據源幾乎總是處於可讀狀態。

3

您想混淆而不是加密jar文件。

在Java中這樣做的一個流行選擇是ProGuard

-1

我更喜歡jCrypt! 這是一個簡單的工具,你可以隱藏類(和資源)

0

如果你正在打包在jar中 - >只需將它重命名爲jarname.ABCD或任何誤導擴展名,甚至脫掉擴展名,並相應地指定jar名稱在您的應用程序中。

0

在申請開始時提供密碼或許可證檢查。通過適當的身份驗證,只有這樣用戶才能夠進一步運行應用程序。

對於密碼檢查,您應該生成生成私鑰 - 公鑰的概念。 對於許可證,可以使用一些安裝的軟件或附加硬件來提供訪問權限。