我在寫一個桌面Java應用程序。該程序從客戶的服務器接收XML文件。幾個標籤中的數據是整數類型的,並用一些數學公式「加密」。 當我的程序解析XML文件時,我需要解密這些標籤。解密公式如下所示:
int decrypted = (int) Math.ceil(Math.pow ((idProduct + 1)/3, 1.5));
解密的數據然後保存到H2數據庫,該數據庫使用AES-128加密。
我需要的是以某種方式從反編譯中隱藏這樣的公式。
在Java中反編譯隱藏數學公式/算法
我的嘗試:
1.爲了隱藏公式,我嘗試使用混淆器,但是我沒有發現任何與公式無關的公式。這是一個被ProGuard的4.8混淆和反編譯的JAD一段代碼:
private String d(String paramString) {
long l = Long.valueOf(paramString).longValue();
int i = (int)Math.ceil(Math.pow((l + 1L)/3L, 1.5D));
String str = String.valueOf(i);
return str;
}
正如你所看到的ProGuard什麼也沒做用公式。我們不能使用像Zelix KlassMaster這樣的商業混淆器。
2.我正在考慮嘗試JET Excelsior(但看起來java 7 apps're還不支持)。另外,我不認爲我的老闆會讚賞。
3.我也想過使用launch4j這樣的包裝器,但我不知道是否很難從中提取.jar。
4.然後我想到在C中編寫一個外部庫並使用JNI。但似乎競爭對手只能使用該庫。
5.良好的解決方案IMO是在ASM中編寫解密函數並將其直接粘貼到java代碼中,就像我們可以做到的那樣是C.不幸的是,這是不可能的。
6.類的加密是pointless to use。
我知道所有的東西都可以反編譯/反彙編,我只是想讓它比運行JAD更容易一點。
請告訴我
如何把它放在服務器上並進行web服務調用? –
他們不是很難的功能,爲什麼不重新實現它們然後混淆? –
通過默默無聞的安全是一個非常糟糕的想法。如果您正在嘗試加密數據,則應該強烈考慮使用衆所周知的開放式加密算法,以便即使人們對程序進行反編譯也不會破壞安全性。 – templatetypedef