我正在编写一个桌面java应用程序。该程序从客户的服务器接收XML文件。几个标签中的数据是整数类型,并使用一些数学公式进行“加密”。
当我的程序解析XML文件时,我需要解密这些标记。解密的公式如下:
int decrypted = (int) Math.ceil(Math.pow ((idProduct + 1) / 3, 1.5));
然后将解密的数据保存到H2数据库,该数据库用AES-128加密
我需要的是以某种方式隐藏这些公式来反编译。
我的尝试:
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应用程序)。此外,我认为我的老板不会赞赏它。
3.我还想过使用像launch4j这样的包装器,但是我不知道是否很难从中提取.jar。
然后我考虑用C语言编写外部库并使用JNI。但似乎竞争对手只能使用该库。
5.好的解决方案IMO是在ASM中编写解密函数并将其直接粘贴到java代码中,就像我们可以做到的那样。不幸的是,这是不可能的。
6.类的加密是pointless to use。
我知道一切都可以被反编译/反汇编,我只是想让它比运行JAD并立刻得到它更难。
请告诉我
答案 0 :(得分:2)
当您考虑在asm / c / c ++中编写公式然后通过JNI访问它时,这意味着在不同的指令集中表示公式。您可以创建自己的硬件指令集,而不是使用硬件指令集,并在代码中嵌入解释器。这样做的缺点是性能较差,但具有使用不常见指令集的优点,因此竞争对手应首先从解释器的字节码重建自制指令集。您可以将指令集设计为比x86更难以理解。
然后,您可以递归地应用这个想法:将解释器写入另一个解释的指令集等。
答案 1 :(得分:0)
您无法向确定要找到它的人隐藏公式。
混淆Java代码没有任何作用,因为可以反编译.class文件并且相对容易地提取算法。
您可以做的最好的事情是在C / C ++中实现公式并通过JNI链接它。但即使采用这种方法,有人也可以对C ++进行反编译,并通过一些努力对该过程进行逆向工程。
如果你的应用程序有一个可以提供机会的结构,你可以通过在处理期间必须全部调用的几个不相关的方法中将它分散出来来隐藏它。