我正在编写一个将敏感数据(密码和私钥)存储在内存中的 Java 程序。它将自由部署到任何操作系统。我知道用户几乎可以在任何系统上手动创建内存转储,但我担心操作系统或 JVM 实现创建的转储(包括但不限于 JVM 本身的某些段错误)会损害隐私敏感数据。
是否可以采取任何措施来降低这些风险? This question是 POSIX 特定的,但给了我这些平台的答案。我有一个非平台特定的想法,包括将 UncaughtExceptionHandler
( like this ) 设置为一个将覆盖敏感数据的类。但是如果内存被换出怎么办?如果 JVM 因 JVM/JNI 错误而崩溃(例如段错误)怎么办?我知道 Linux 可以阻止数据交换到磁盘,但是是否有 Java 代码可以跨平台执行此操作?大多数情况下,我担心在磁性存储设备上恢复数据的可能性,因此非常感谢您的帮助。
最佳答案
如果您无法控制操作系统,您基本上无法禁止用户访问您在内存中的内容。
因此,您需要将保留的敏感数据量保持在绝对最低限度。想象一下,知识渊博的用户附加了一个调试器,暂停您的程序并窥探您的数据结构,挑选他们需要知道的任何内容。
因此,当使用密码完成后,将所有引用设置为空。使用键完成后,将它们的引用设置为空。请注意,这对确定的知识渊博的用户没有帮助,但它至少会最大限度地减少意外发现的机会。
关于java - 如何禁止 Java VM 在崩溃/将敏感数据写入磁盘时创建任何转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6074776/