使用Spark Java(webserver)从内存中删除敏感数据

时间:2016-04-16 18:58:36

标签: java security web passwords spark-java

我正在使用SparkJava,在处理密码时我很感到安慰。这个想法是将密码(以纯文本形式)传递给服务器(显然是在https下),然后是哈希和盐服务器端,并将salt和hash存储在服务器上供用户使用。但是,根据此post,出于安全原因,绝不应将纯文本密码作为String存储在内存中。

但是,当使用SparkJava从POST请求访问http协议体时,API会返回一个具有明文密码的String。

Route post = (request, response) -> {
    String dataWithPassword = request.body();
    //     ^-- Stays in memory until GC kicks in 
}

我该如何确保从客户端收到的明文密码不会存储为String服务器端,因此这可能永远不会成为潜在的安全漏洞?或者我还能做些什么来确保内存被清除并且明文密码不会留在内存中?

1 个答案:

答案 0 :(得分:0)

您的方式已经确保此密码永远不会存储在文件中,例如服务器日志。但在Java中,没有官方的方法可以清除内存。您无法保证清除保存纯文本密码的内存。您甚至可以将引用dataWithPassword设置为null并调用System.gc(),这表示现在是运行垃圾收集器的好时机,但不能保证清除该内存。我发现您的方法中可能存在的安全问题是将密码以纯文本形式从客户端发送到服务器,即使使用https(我强烈建议不要这样做)。您可以做的最好的事情是要求客户端o给您已加密的密码,这样您就不必担心内存中的这个值,并且您将获得更多安全性,因为网络嗅探器和代理将会现在不是密码是什么。