2009-02-11 160 views
16

我正在研究必須保護數據(顯示代碼不是主要問題)文件的項目。我們正在使用Java + Netbeans。是否有任何工具會以加密格式創建jar?我們也使用sqlite的數據庫 - 所以把文本文件加密格式也不適合我們。如何創建加密的Jar文件?

+4

您的設計有缺陷;將敏感數據與代碼一起運輸並不是一個聰明的想法。 – Rob 2009-02-11 16:55:48

+0

這是桌面應用程序。 Java用於跨平臺兼容性。 – 2009-02-11 19:07:16

回答

20

創建加密的JAR是不可能的,因爲正在執行的JavaVM必須以某種方式能夠讀取它想要執行的數據。 與VM相似,任何擁有合適工具和專有技術的人都可以從JAR中提取所有數據。

如果可以對JAR進行加密,那麼您還必須向想要執行JAR的客戶端提供一些解密密鑰或工具,這完全破壞了加密的目的。

你可以得到的最好是混淆,但這對雄心勃勃的攻擊者來說並不是真正的安全或障礙。

2

另一種選擇是製作一個自定義JVM,用於即時解密JAR。但是同樣的問題仍然存在:在某些時候,JAR Java類必須被解密才能被JVM運行,並且在那時它們可以被捕獲和解編譯。

更不用說,擁有自定義JVM的用戶也需要下載該JVM。

1

您可以使用CipherOutputStream和CipherInputStream以加密格式將Java對象序列化到磁盤。這可能會打開一個選項來保存數據。

7

Kosi2801是非常正確的。我能想到的唯一可以做的就是以下,但它很醜。

  1. 發送一個小的標準JAR和一個加密的數據文件。
  2. 當JAR運行時,它會將(某些)加密數據文件解密到內存中(如數據在JAR中的目錄,基本上是指針/長度對的簡單內存中文件系統)
  3. Set你自己的類加載器,調用它時,從JAR得到正確的加密字節(使用#2中描述的僞FS表),對密碼進行解密,然後加載從那裏

這類數據讓你加載類。你可以做同樣的事情(沒有類加載器)加載其他資源。

雖然好玩實現(對於那些誰喜歡挑戰),有幾個問題是:

  1. 你需要能夠解密的東西,所以用戶要麼必須進入每次都有密碼或類似的東西。如果JAR知道足以解密它自己,那麼任何人都可以查看它並找出如何解密事物。這可以通過聯繫Internet上的已知好的服務器來請求解密密鑰(只要您確保該過程安全)就可以緩解。當然,這需要有人希望運行該程序時有效的「網絡連接」。
  2. 一切都結束在內存。如果沒有自定義的JVM來處理加密字節碼的小部分(正如Cameron McKay所述),這些類最終會在某個時刻在主內存中解密。除非你依靠操作系統來阻止其他人閱讀那些記憶,否則你已經失去了對任何有點時間的人的戰鬥。您嘗試從某些加密存儲中讀取的資源(例如圖像/字體/等)的相同問題。

因此,您可以給人們帶來周旋,讓事情變得更加艱難,但在您給予的所有情況下,您可以做的就是儘量讓其他人不必投資。

軟件保護很困難,特別是在像Java這樣可以很容易地反編譯並且不能像C/Assembly那樣改變它自己的代碼的情況下。有一個原因是,一些最昂貴的軟件需要硬件加密鎖,或者鎖定到特定的CPU或其他硬件。

3

通常,如果您希望應用程序及其數據是自包含的,則無法以安全的方式執行此操作。但是,您可以對文件進行加密,並使用隱藏在代碼中的密鑰對它們進行標記。一個堅定的黑客可以得到它,但如果這不是你所擔心的,那麼很好。如果你這樣做,記住加密的數據不能被壓縮,所以先壓縮,然後加密。

如果您真的需要數據是安全的(例如,機密數據),您需要使用密鑰對數據進行加密,並使用我的一些外部手段將該密鑰提供給應用程序,例如將其放在拇指驅動器上,通過一位安全的快遞員將其交給用戶。

另一種可能性是通過SSL提供數據(或密鑰),並使用良好的身份驗證方法來驗證您的用戶是誰。

一般來說 - 任何系統都不可能完全安全,但它也不是無用的。一個系統只需要有足夠的安全性來阻止你認爲會攻擊的攻擊者。

9

我同意Kosi2801。類文件加密只是模仿安全性(請參閱http://www.excelsior-usa.com/articles/java-obfuscators.html) 使用自定義ClassLoader可能會破壞應用程序,例如,在應用服務器中。

還有更好的方法:在類文件中使用字符串常量的加密。大多數商用混淆器都具有此功能,例如AllatoriStringer Java Obfuscation Toolkit,Zelix KlassMaster,Smokescreen,DashO(超級昂貴)。 Stringer Java混淆器具有調用上下文檢查和完整性控制功能,這使得保護真的很難破解。

最安全的方法是在像JavaCard這樣的外部設備上存儲和執行部分字節碼。

N.B.我是Licel LLC的首席執行官。 Stringer Java混淆器的開發者。