【发布时间】:2011-08-29 12:28:54
【问题描述】:
我是一名初学 Java 程序员。我正在开发一个解密一些数据的应用程序。 解密密钥被硬编码到软件中,因此可以通过分析字节码来查看。
我知道无法完全防止逆向工程,所以我正在尝试做的是让这个过程尽可能困难。
我的想法不是直接将密钥放入我的代码中,而是让它经过某种转换。 例如,我可以写 -
private static final byte[] HC256A = Hex
.decode("8589075b0df3f6d82fc0c5425179b6a6"
+ "3465f053f2891f808b24744e18480b72"
+ "ec2792cdbf4dcfeb7769bf8dfa14aee4"
+ "7b4c50e8eaf3a9c8f506016c81697e32");
这样查看字节码的人就无法立即读取它。但必须遵循逻辑并对其应用转换,这在字节级别不会那么容易。
那你们觉得呢?这有用吗?除了十六进制解码之外,最好的转换是什么? 有没有其他方法可以保护硬编码的解密密钥?
感谢您的所有建议。
【问题讨论】:
-
你可以监听调试器连接(在 C++ 中工作,不知道如何在 Java 中做到这一点),如果是,从内存中删除值。
-
被解码的数据的敏感度是多少?这将有助于指导为保护该数据付出多少努力。在字节码中隐藏密钥的任何形式都相对容易被击败。此外,这将要求软件的每个用户都拥有相同的密钥,并且需要重新编译才能更改为密钥。
-
数据相当敏感。这是一种数字媒体印刷品,如果泄露会给公司带来严重的问题。
标签: java security reverse-engineering encryption drm