在 Java 中将密码存储在内存 (RAM) 中的最佳方法是什么?

信息安全 密码 爪哇
2021-09-06 16:47:08

想象一下 Java 应用程序中有一个登录表单。我们需要将用户名和密码分配给变量。之后我们可以散列或 HMAC 密码并将其保留仅用于身份验证步骤(无缓存)。但是我们仍然需要为原始密码分配变量。

Q1)我们应该使用什么样的变量类型来存储原始密码(字符串、字符数组或其他)?

Q2)原始密码变量使用后我们应该怎么做(即只允许垃圾收集器在函数超出范围后转储它)?

Q3)还有什么吗?

这是一个与 Java 相关的问题。我把它贴在这里,因为它非常接近安全性。

对于 C/C++,我几乎没有什么想法。他们是

  • 将密码存储在不依赖于其他库的低系统级变量中。即在 char [] 中存储密码,这比框架提供的 QString (Qt) 类型变量非常原生。

  • 使用后立即覆盖密码 char[]。然后摧毁它。

  • 尽量减少密码在内存中的时间。

1个回答

一般的指导是使用 char[],虽然它不是万无一失的,但是一旦你完成了密码中的字符,就可以覆盖它们,这是字符串不可能的,因为它们是不可变的并且继续存在在堆上直到垃圾收集。

这也已在StackOverflow上进行了详细讨论