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

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

我遇到的问题是,在没有生成String对象的情况下,似乎无法获取头数据,这违反了get-go的准则。 我已经彻底搜索了一个解决方案,但没有找到任何相关的讨论。 有没有人对此问题有任何见解?

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

简单的答案是你不能以String之外的任何forms获取参数。 至少,不使用标准的servlet API。 但是有一些可能的“出局”。

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

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


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

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

  • 破解JVM执行模型并查看原始内存的hack,
  • 附加Java调试器并遍历可到达的对象,
  • 使用“/ dev / mem”或类似方法从外部读取进程内存,
  • 访问硬盘驱动器上程序交换图像的剩余部分,或
  • 以某种方式导致它进行核心转储和读取转储。

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

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

总而言之,“没有字符串”可以防止真正困难的黑客攻击,或者防止您的安全性已经被破坏的情况。 IMO,不值得努力……除非你被要求实施军事级安全。