0

说我有

private void ThisIsMySecurityMethodPleaseLookHERE() {
//security stuff
}

在我的程序中,但在任何实际执行的代码中都没有调用该方法。它会被编译成字节码吗?还是 Java 编译器识别出这个事实并将其过滤掉?我知道它永远不会使它成为过去的字节码,因为它并没有真正被调用。

我问是因为我知道 Java 是出了名的容易反编译。当他们反编译我的一个 .class 文件时,我所有未使用的方法也会出现吗?

我认为情况并非如此,因为如果是这种情况,每个 java 文件都会有膨胀代码来隐藏真实代码,并通过混淆器传递。

我只是想想一些除混淆之外的方法来抵抗随便的黑客。

4

3 回答 3

9

为什么要假设什么?用于javap -c查看字节码中的内容。

鉴于编译器无法知道是否可以通过反射调用私有方法,我个人希望它仍然存在。

我不确定你的意思是什么:

我认为情况并非如此,因为如果是这种情况,每个 java 文件都会有膨胀代码来隐藏真实代码,并通过混淆器传递。

我希望大多数开发人员能够意识到,通过默默无闻的安全性根本没有保护作用——而且代码本身的真正价值通常在于设计等,而不仅仅是实现。所以不,不要在你的课程中包含敏感信息——但同样不要太偏执。您需要权衡试图击败攻击者的成本与他们“获胜”的成本。这种平衡将取决于所涉及的代码 - 以及您试图防范的攻击类型。

于 2011-12-12T19:12:15.043 回答
1

私有方法实际上会将其转换为字节码。甚至可能是汇编代码。您必须考虑将所有这些方法转换为例程。因此,对于任何未使用的私有方法,字节码块中仍然会有一个例程。

另一方面,有一些工具可以清理这些东西并删除未使用的过多代码/类。如果是这样的话,是的,您在反编译的代码中没有它们。

于 2011-12-12T19:13:12.143 回答
0

测试并查看您是否需要添加选项-p(aka -private)来获取私有方法内容。

于 2020-09-01T09:47:23.530 回答