有没有一种方法可以阻止反射一个类?

4
我正在自学Java的安全API,同时制作一个密码类。这个类将包含一些敏感信息,例如加密类型等。如果有人有动机,所有这些都可以通过反射来检索。
我以前曾使用过反射来绕过私有变量和方法(并不为此感到骄傲),所以我知道这是可行的。是否有一种方法可以完全防止反射对整个类 - 或甚至部分类 - 的操作,或者这是否违反了Java - 更具体地说是安全API - 的设计?

4
Kerckhoffs原则:即使系统的所有细节被公开,除了密钥以外,密码系统也应该是安全的。换句话说,人们可以看到您使用的算法,但这不应该影响系统的安全性。 - Mark Peters
2个回答

10

这被称为“安全性通过混淆” - 如果你的加密算法的细节被知道会使其不安全,那么它已经是不安全的。

不,你无法阻止别人反编译你的类。在最坏的情况下,他们可以加载一个JNI库,直接进入JVM堆并从那里读取(或写入)内存内容!如果你的代码在受他人控制的机器上运行,那么它所做的任何事情都不是真正私密的。

如果你自己编写了一个JNI库,它可以被反编译和逆向工程化(而且在许多司法管辖区的过去案例法中明确是合法的)。

只需使算法在所有人都知道其运作方式时也是安全的,或者(更好的选择!)使用已经编写并成为Java语言一部分的实现。

如果你担心的是“关键材料”的披露,请使用Java的密钥库访问方法。如果你真的很偏执,强制要求后端存储库是PKCS11硬件令牌。


@Borealid 感谢您提供详细的答案,尽管如果我以前不是多疑的话,现在我是了。对我来说,安全似乎唯一的作用就是阻止没有动机的人做坏事。 - ahodder
2
@Aedon:这不是重点,重点是混淆你的代码不应该对安全性产生影响。有很多安全系统经受住了时间的考验(AES、RSA等),它们是公开的,从未被破解过(只要给定一个足够大的密钥)。但我所知道的没有任何加密系统可以保护加密/解密的过程,而只能保护数据的存储或传输。 - Mark Peters
@Mark Peters 哦,我明白了。谢谢你的教育。 - ahodder

2
不行的 - 如果你无法控制涉及的安全管理者或代码的物理分发,则任何人都可以查看它。即使您可以确保您的应用程序通常运行在配置为防止反射的安全管理器下,如果攻击者拥有您的代码(例如一个jar文件),则他们可以随意运行它 - 或者反编译它,查看其内容等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接