【问题标题】:Is there a way to block a class from being reflected upon?有没有办法阻止一个类被反映?
【发布时间】:2012-02-09 17:38:47
【问题描述】:

我在自学 java 的安全 api 时正在做一个密码课程。这个类里面会有一些敏感的东西,比如加密的类型等等。如果有人有动机,所有这些都可以通过反思来检索。

我以前用反射绕过私有变量和方法(并不以此为傲),所以我知道可以做到。有没有办法完全防止反射作用于整个类 - 甚至是部分类,或者这是否违背了 java 的 - 更具体地说是安全 api - 设计?

【问题讨论】:

  • Kerckhoffs's Principle: 密码系统应该是安全的,即使系统中的所有内容(除了密钥)都是公共知识。 换句话说,人与否无关紧要可以看到你正在使用什么算法。

标签: java security reflection


【解决方案1】:

这被称为默默无闻的安全 - 如果知道您的加密算法的细节会使其不安全,那么它已经不安全了。

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

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

即使算法的工作原理众所周知,也只需确保算法的安全,或者(更好!)使用已经编写并属于 Java 语言一部分的实现。

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

【讨论】:

  • @Borealid 谢谢你的详细回答,不过,如果我以前不偏执,现在我是。对我来说,这听起来是唯一真正能阻止没有动力的人做坏事的安全措施。
  • @Aedon:这根本不是重点,重点是混淆您的 代码 不应该对安全性产生影响。有许多安全系统经受住了时间的考验(AES、RSA 等),它们已发布并且从未被破坏(给定一个秘密和足够大的密钥)。但据我所知,没有任何加密系统可以保护加密/解密点,而是数据的存储或传输。
  • @Mark Peters 啊,我明白了。谢谢你教育我。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 2012-04-18
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2020-11-03
    • 2021-09-01
    相关资源
    最近更新 更多