无论如何在Java中删除数据(例如,变量值,对象)并确保它无法从内存中恢复?分配null
给Java中的变量是否会从内存中删除值?有任何想法吗?适用于其他语言的答案也是可以接受的.
由于奇迹虚拟内存,几乎不可能以完全无法挽回的方式从内存中删除内容.您最好的选择是将值字段清零; 然而:
这并不意味着对象的旧(非零)副本不会留在未使用的交换页面上,这可能会在重新启动后持续存在.
也没有阻止某人将调试器附加到您的应用程序并在对象被归零或崩溃VM并在堆转储中进行调整之前进行调整.
将敏感数据存储在数组中,然后尽快将其"清零".
RAM中的任何数据都可以通过虚拟内存系统复制到磁盘.RAM(或核心转储)中的数据也可以通过调试工具进行检查.为了尽量减少发生这种情况的可能性,您应该努力做到以下几点
保持时间窗口秘密在内存中尽可能短
注意内部缓冲数据的IO管道(例如,BufferedInputStream)
保持对堆栈和堆外的秘密的引用
不要使用不可变类型
String
来保存秘密
Java中的加密API使用这种方法,您创建的任何API也应该支持它.例如,KeyStore.load
允许呼叫者清除密码char[]
,并在呼叫完成时,与基于密码的加密的KeySpec一样.
理想情况下,您可以使用finally
块将数组归零,如下所示:
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); InputStream is = … char[] pw = System.console().readPassword(); try { ks.load(is, pw); } finally { Arrays.fill(pw, '\0'); }