有没有办法阻止一个类被反思?

时间:2012-02-09 17:38:48

标签: java security reflection

我正在教自己关于java的安全api的密码课程。这个类中会有一些敏感的东西,比如加密类型等。所有这一切都可以被反思地检索出来,有人有动力。

我之前使用反射来绕过私有变量和方法(不以此为荣),所以我知道可以做到。有没有办法完全阻止反思在整个班级上工作 - 甚至是部分内容,或者是否违反了java - 更具体地说是安全api - 设计?

2 个答案:

答案 0 :(得分:10)

这被称为安全隐藏 - 如果已知加密算法的详细信息会使其不安全,那么它已经不安全了。

不,你不能阻止人们反思你的课程。在最糟糕的情况下,他们可以加载一个JNI库,它将直接进入JVM堆并从那里读取内存内容(或写入它们)!如果您的代码在其他人的控制下运行,那么它所做的一切都不是真正的私有。

如果您自己编写JNI库,则可以对其进行反编译和反向工程(此外,在许多司法管辖区,这在过去的案例法中是明确合法的)。

即使所有人都知道它的工作原理,或者(更好!)使用已经编写并且是Java语言一部分的实现,只需使算法安全。

如果您担心的是密钥材料的泄露,请使用Java方法进行密钥库访问。如果您真的是偏执狂,请强制后备存储区为PKCS11硬件令牌。

答案 1 :(得分:2)

否 - 如果您对所涉及的安全管理人员或代码的物理分发没有任何控制权,那么任何人都可以查看它。即使您可以确保您的应用正常运行时安全管理器配置为防止反射,但如果攻击有您的代码(例如jar文件),那么他们可以运行它,但他们喜欢 - 或反编译,查看内容等。