【问题标题】:Do private fields provide any practical security?私有字段是否提供任何实际的安全性?
【发布时间】:2014-11-09 20:20:44
【问题描述】:

既然我们可以通过反射访问任何东西,无论它是一个字段、方法还是构造函数,声明私有的东西有什么真正的帮助/做什么?私有字段的唯一目的是告诉其他程序员,嘿,这个字段不应该这样使用吗?

在谈到安全性时,有没有办法阻止用户访问 API(为了主题,假设它是闭源的)私有和受保护字段?

【问题讨论】:

  • 访问修饰符与安全性无关,它们用于封装。
  • 那么我可以从哪里获得安全性呢?
  • 您似乎对 API 设计的安全性感到困惑。除非您在您控制的 JVM 上运行代码,否则无法阻止用户访问 API。
  • @OlaviMustanoja,请在您的程序上下文中定义“安全性”。
  • @MikeSamuel 安全性,因为不允许以任何方式在包含私有字段的类之外访问私有字段。没有产生这个问题的程序,这只是我的普遍好奇心。

标签: java security reflection private-members


【解决方案1】:

如果您允许不受信任的代码在没有安全管理器的 JVM 中运行,它可以通过 setAccessible 关闭 private 检查,从而通过反射使 private 字段和方法可用。

Java 的SecurityManager 有一个poor history of withstanding determined attacks,因此假设SecurityManager 会阻止可导致任意字节码加载的坚定攻击者是不合理的。

即使SecurityManager 成立,概念证明也显示了如何通过序列化 API 等低级 Java API 提取秘密。

Can a secret be hidden in a 'safe' java class offering access credentials? 列出了尝试将敏感数据存储在同时运行不受信任代码的 JVM 中的字段中的一些陷阱。

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多