如何保护解密密钥免受反编译?

时间:2011-05-20 09:24:21

标签: java security reverse-engineering encryption drm

我是初学Java程序员。我正在开发一个解密一些数据的应用程序。 解密密钥被硬编码到软件中,因此可以通过分析字节码来看到。

我知道逆向工程不能完全被阻止,所以我要做的就是让这个过程尽可能地努力。

我的想法不是直接将密钥放入我的代码中,而是让它经历某种转换。 例如,我可以写 -

private static final byte[] HC256A = Hex
            .decode("8589075b0df3f6d82fc0c5425179b6a6"
                    + "3465f053f2891f808b24744e18480b72"
                    + "ec2792cdbf4dcfeb7769bf8dfa14aee4"
                    + "7b4c50e8eaf3a9c8f506016c81697e32");

这样,查看字节码的人无法立即读取它。但是必须遵循逻辑并对其应用转换,这在字节级别上不会那么容易。

那你们觉得怎么样?这有用吗?除十六进制解码之外,最好的转换是什么? 是否有其他方法可用于保护硬编码的解密密钥?

感谢你的所有建议。

3 个答案:

答案 0 :(得分:8)

攻击此类混淆的正确方法(尤其是在字节码语言中)是将调试器附加到密钥传递到的位置(如果无法进行调试,则从该位置开始分析代码)。这样攻击者根本不需要查找密钥,他也不关心密钥是如何混淆的。所以你需要重新思考你的设计。

如果您只想保护业余潜水员,那么拆分钥匙并对其部件进行异或(可能使用不同的钥匙)就足够了。还有一个技巧 - 从代码中已存在的文本常量(例如应用程序名称)派生密钥。这使得密钥不如分裂或异或。

答案 1 :(得分:3)

根本不要将密钥编码到源代码中。保持分开,单独发货,例如在Java密钥库中,并且仅限于您信任的客户/站点/客户端,并在许可证中加入一些法律术语,如果它们泄露密钥库,则会将责任放在它们上。

答案 2 :(得分:0)

面对类似的问题(在c中)我使用了一次性XOR垫。这很好,因为它看起来像垃圾...如果你真的很聪明,你可以窥探使用中的那个(不正确的)密钥。我会避免任何注入人类可读字符串的东西,因为这些字符串总会引起人们对这段代码的注意。