16

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

我遇到的问题是,在不生成 String 对象的情况下似乎无法访问标头数据,这违反了从一开始的指导方针。我已经非常彻底地搜索了一个解决方案,但没有找到任何相关的讨论。有人对这个问题有任何见解吗?

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

4

1 回答 1

16

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

  1. 如果您准备变得非常丑陋,您实际上可以打破 String 对象的抽象,并覆盖并覆盖字符。(如果你准备好打破规则,字符串实际上是可变的。这是少数几种情况之一,这可能是合理的。)

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


话虽如此,IMO 对 Java 安全性的“无条件”方法是被误导的,或者至少在它所实现的方面被高估了。

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

  • 一种破坏 JVM 执行模型并查看原始内存的 hack,
  • 附加一个 Java 调试器并遍历可访问的对象,
  • 使用“/dev/mem”或类似的从外部读取进程内存,
  • 访问硬盘驱动器上程序交换映像的剩余部分,或
  • 不知何故导致它核心转储并读取转储。

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

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

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

于 2013-02-22T03:48:32.290 回答