java - 在 Java 中,如何在不生成 String 对象的情况下从 HttpServletRequest header 中提取密码?

标签 java security servlets passwords http-headers

用于处理敏感数据(== 密码)的通用 Java 安全准则建议永远不要使用 String 对象来存储数据,而应使用字节或字符数组。我正在尝试在 HttpServlet 处理程序中应用此指南。特别是,我使用了一种类似基本身份验证的方法,其中在 header 中传递凭据(这是一个 GET 请求,所以没有正文)。

我遇到的问题是,如果不生成 String 对象就无法获取 header 数据,这从一开始就违反了准则。我已经非常彻底地搜索了一个解决方案,但没有找到任何相关的讨论。有人对这个问题有任何见解吗?

注意:这是通过 HTTPS 进行的,因此这里没有连接安全问题。

最佳答案

简单的答案是,除了字符串之外,您无法获得任何其他形式的参数。至少,不使用标准的 servlet API。但是有几个可能的“出路”。

  1. 如果您准备变得非常丑陋,您实际上可以打破 String 对象的抽象,并进入并覆盖字符。 (如果您准备打破规则,字符串实际上是可变的。这是为数不多的可以证明这一点的情况之一。)

  2. 在您的 Web 容器的(比方说)HttpServletRequest 实现中可能有一个非标准的 API 扩展来执行此操作。如果没有,您可以获取源代码并添加一个。 (假设您使用的是开源 Web 容器。)


话虽如此,IMO 对 Java 安全性的“无字符串”方法是错误的,或者至少就其实现的目标而言被高估了。

“无字符串”方法可以防止某些东西可能会遍历您的应用程序的地址空间,找到看起来像字符串的东西,并嗅出可能的密码。理论上,这可以通过以下方式完成:

  • 一个被黑客入侵(或易受攻击)的 Java 应用程序,它会破坏 JVM 的执行模型并查看原始内存,
  • 附加 Java 调试器并搜索可访问的对象,
  • 使用“/dev/mem”或类似的方式从外部读取进程内存,
  • 访问硬盘驱动器上程序交换镜像的剩余部分,或者
  • 以某种方式导致核心转储并读取转储。

但是,除了第一个之外,所有这些都要求坏人已经破坏了系统的安全性。如果坏人已经这样做了,还有其他(可能更简单)的方法可以从您的程序中窃取密码……“无字符串”方法无法阻止。

如果您担心黑客利用 Java 安全漏洞读取原始内存,那么该漏洞可能会以其他方式被利用;例如注入(inject)代码以改变代码处理密码的方式。

因此,总而言之,“无条件”可以防止非常困难的黑客攻击,或者防止您的安全性已经被破坏的情况。 IMO1,不值得付出努力......除非您需要实现军事级安全。


1 - 请参阅 Why is char[] preferred over String for passwords?其他观点。

关于java - 在 Java 中,如何在不生成 String 对象的情况下从 HttpServletRequest header 中提取密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15016250/

相关文章:

java - 如何以编程方式在 cookie 上设置安全标志

security - Glassfish 中的基本身份验证

java - 从 servlet 内部调用 java 方法

javascript - 无法从不同的 WebApp (Tomcat) 获取图像/JS

java - 简而言之,后缀树的 Java 实现和用法?

security - 网络安全

java代码计算排序算法的运行时间

spring - 是否可以获得所有事件 session 的列表?

java - JButton 切换禁用和启用 ItemListener

java - 无法连接到 SMTP 主机 : smtp. gmail.com,端口 : 465, 响应:-1 为什么 465 不起作用