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



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

我遇到的问题是,在不生成String对象的情况下似乎不可能获取标头数据,这从一开始就违反了准则。我已经非常彻底地寻找了解决方案,但没有找到任何相关的讨论。有人对这个问题有什么见解吗?

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

简单的答案是,除了String之外,您无法获得任何其他形式的参数。至少,不要使用标准的servlet API。但是有几个可能的";退出";。

  1. 如果您准备变得非常丑陋,那么实际上您可以打破String对象的抽象,并访问和覆盖字符。(事实上,如果你准备打破规则,字符串是可变的。这是少数可以证明这一点的情况之一。)

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


话虽如此,IMO;无字符串";Java安全的方法被误导了,或者至少在它所取得的成就方面被高估了。

";无字符串";这种方法可以防止某些东西在应用程序的地址空间中搜索,找到看起来像字符串的东西,并找出可能的密码。理论上,这可以通过以下方式实现:

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

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

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

总之;无字符串";是为了防止真正困难的黑客攻击,或者防止您的安全已经被破坏的情况。IMO1,这是不值得的努力。。。除非要求执行军用级安全。


1-请参阅为什么密码首选char[]而不是String?其他观点

相关内容

  • 没有找到相关文章

最新更新