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

Dan*_* S. 16 java security passwords servlets http-headers

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

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

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

Ste*_*n C 16

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

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

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


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

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

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

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

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

总而言之,"没有字符串"可以防止真正困难的黑客攻击,或者防止安全性已经被破坏的情况.国际海事组织,这是不值得的努力...除非你被要求实施军事级别的安全.