我正在编写一个Java程序,用于在内存中存储敏感数据(密码和私钥)。它可以自由地部署到任何操作系统上。我知道用户可以在几乎任何系统上手动创建内存转储,但我担心由OS或JVM实现创建的转储(包括但不限于JVM本身的某些段错误)会危及敏感数据的隐私。
有什么步骤可以降低这些风险吗?This question是特定于POSIX的,但给了我一个针对这些平台的答案。我有一个与平台无关的想法,包括将UncaughtExceptionHandler (like this)设置为覆盖敏感数据的类。但是如果内存被换出了怎么办呢?如果由于JVM/JNI错误而导致JVM崩溃(例如分段错误),该怎么办?我知道Linux可以阻止数据交换到磁盘,但是有没有Java代码可以做到这一点呢?我最担心的是在磁存储设备上恢复数据的可能性,所以任何帮助都是非常感谢的。
发布于 2011-05-21 00:55:57
如果你试图阻止临时用户,那么你真的不需要做任何事情。如果您试图阻止知识丰富/意志坚定的用户,并且您正在他们的计算机上运行代码,那么您将无能为力。
如果您唯一担心的是程序“意外”地将内容写入磁盘,那么,再说一次,您无能为力。java程序不会生成堆转储,除非您明确告诉它们这样做。任何从未捕获异常中获得输出的堆栈跟踪都不太可能包含任何敏感内容。当jvm以受控方式分段时写入的文件也不太可能包含任何敏感内容。唯一可能出现问题的是unix系统的某个变体上的核心转储。不幸的是,我不相信您可以在程序级别控制它,只能在系统/用户配置级别(在您链接的第一个问题中提到)。
发布于 2011-05-21 00:38:50
如果您无法控制操作系统,则基本上无法禁止用户访问您在内存中的内容。
因此,您需要将您持有的敏感数据的数量保持在绝对最小。想象一下,知识渊博的用户附加了一个调试器,暂停你的程序,在你的数据结构中窥探,精挑细选他们需要知道的东西。
因此,当使用密码完成时,将所有引用设置为null。使用键完成后,将它们的引用设置为null。请注意,这对确定的知识丰富的用户没有帮助,但它至少会将意外发现的机会降至最低。
https://stackoverflow.com/questions/6074776
复制相似问题