java - 如何保护解密 key 不被反编译?

标签 java security reverse-engineering encryption drm

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

我知道逆向工程是无法完全避免的,所以我想做的是让这个过程尽可能困难。

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

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

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

那么大家怎么看呢?这有用吗?除了十六进制解码之外,最好的转换是什么? 是否有任何其他方法可用于保护硬编码解密 key ?

感谢您的所有建议。

最佳答案

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

如果您只想防止业余潜伏者的攻击,那么拆分 key 并对它的各个部分进行异或运算(可能使用不同的 key )就足够了。另一个技巧 - 从代码中已经存在的文本常量(例如应用程序名称)派生 key 。这使得 key 不如拆分或异或运算那么明显。

关于java - 如何保护解密 key 不被反编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6069907/

相关文章:

javascript - 尝试使用 Ajax 获取图像时出现访问控制源问题

exchange-server - Linux 上的 Exchange edb

c++ - 在 C++ 中查找函数的地址

java - 数组大小为 600 且冲突最少的哈希码

Javafx/FXML : conflict between initialize() method and FXML Loader:Initialize: NullPointerException, FXML.LoadException

java - 添加之前检查 Controller 方法中是否存在模态属性

security - 追溯保护Elasticsearch安装

java - 保护字段免受反射 - System.security 的奇怪案例

python - 逆位运算符

java - java中的方法无法应用于给定类型错误