Dan*_* S. 16 java security passwords servlets http-headers
处理敏感数据(==密码)的常见Java安全准则建议永远不要使用String对象来存储数据,而是使用字节或字符数组.我试图在HttpServlet处理程序中应用此指南.特别是,我使用类似于基本身份验证的方法,其中凭据在标头中传入(这是一个GET请求,因此没有正文).
我遇到的问题是,在没有生成String对象的情况下,似乎无法获取头数据,这违反了get-go的准则.我已经彻底搜索了一个解决方案,但没有找到任何相关的讨论.有没有人对此问题有任何见解?
注意:这是通过HTTPS进行的,因此这里没有连接安全问题.
Ste*_*n C 16
简单的答案是你不能以String之外的任何形式获取参数.至少,不使用标准的servlet API.但是有一些可能的"出局".
如果你准备变得非常丑陋,你实际上可以打破String对象的抽象,并覆盖并覆盖字符.(如果你准备违反规则,字符串实际上是可变的.这是少数情况之一,这可能是合理的.)
在您的Web容器的实现(例如)中可能存在非标准的API扩展HttpServletRequest.如果没有,您可以获取源代码并添加一个.(假设您使用的是开源Web容器.)
话虽如此,IMO对Java安全性的"无字符串"方法是错误的,或者至少在它实现的目标方面被高估了.
"无字符串"方法可以防止某些东西可以通过应用程序的地址空间进行搜索,找到看起来像字符串的东西,并嗅出可能的密码.从理论上讲,这可以通过以下方式完成:
但是,除了第一个之外的所有要求都要求坏人已经破坏了系统的安全性.如果坏人已经这样做,还有其他(可能更简单的)方法从你的程序中窃取密码......"无字符串"方法无法阻止.
如果你担心利用Java安全漏洞来读取原始内存,那么这个漏洞可能会以其他方式使用; 例如,注入代码以改变代码处理密码的方式.
总而言之,"没有字符串"可以防止真正困难的黑客攻击,或者防止安全性已经被破坏的情况.国际海事组织,这是不值得的努力...除非你被要求实施军事级别的安全.