java - 使用 Spark Java(网络服务器)时从内存中删除敏感数据

标签 java security web passwords spark-java

我正在使用SparkJava我在处理密码时很担心。这个想法是将密码(以纯文本形式)传递到服务器(显然是在 https 下),然后在服务器端进行哈希和加盐,并将盐和哈希存储在服务器上供用户使用。然而根据这个post出于安全原因,纯文本密码永远不应作为字符串存储在内存中。

但是,当使用 SparkJava 从 POST 请求访问 http 协议(protocol)主体时,API 返回一个字符串,其中包含明文密码。

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

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

最佳答案

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

关于java - 使用 Spark Java(网络服务器)时从内存中删除敏感数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36668391/

相关文章:

rest - 确保移动应用程序访问 RESTful Web 服务的安全

javascript - 我解决了与 IE9 相关的正则表达式问题,但我不确定它如何或为何工作

html - 如何根据单词的长度在单词之间创建等距空间?

java - 浏览器如何与 Flash Player 或 Java Applet 交互?

security - slice 操作导致缓冲区溢出和用户密码泄露?

java - 如何从@ToString lombok 注释生成的字符串转换为对象?

node.js - Node.js 中的安全性

jquery - Fancybox 简单的 href 麻烦

java - 处理类的 RunTimeExceptions

java - 通过 Lotus Notes 使用 java Apache Commons Mail 发送电子邮件