我在这里有一个JVM内部专家的问题。
在Java虚拟机中,对象内容存储在堆内存中,直到它们是Garbage Collected。通常,当没有更多可用内存时会发生GC,因此如果JVM有大量可用空间,那么GC可能需要很长时间。
从安全的角度来看,你能想象一种方法可以让某人访问JVM内存并获取堆空间的转储,在那里可以找到等待GC的未使用对象吗?
我的意思是:如果我的程序处理敏感数据,并且我在执行涉及它们的进程后不会引用这些敏感对象的方式对我的应用程序进行编码,恶意软件或系统管理员是否可以访问堆空间并分析它以找到这些敏感数据?
Scala的使用是否会在内存管理和垃圾收集方面发生任何变化?
答案 0 :(得分:3)
系统管理员当然可以访问JVM内存。作为最后一个资源,他/她可以转储JVM进程内存并检查它。实际上,您必须信任您将要执行的平台。
您可以使用char[]
超过String
(这是不可变的)来减少内存中未加密的合理数据的时间窗口,并在离开您的范围之前用零覆盖它们定义它们,但会有一个时间跨度,这些数据以明文形式提供。
在较低级别,您可以加密内存,这仍然会在某处留下未加密的密钥。您还可以防止内存页面被交换,如果您的应用程序使用RAM的相关部分并且系统不完全专注于它,那么无论如何都不会阻止转储并且可能是性能损失。无论如何,这些解决方案只会保护静态数据,据我所知,没有JVM实现它们。
使用Scala不会有太大变化,因为这是一个特定于JVM的问题,与编译为字节码的源语言无关。
答案 1 :(得分:2)
在Java中,你可以这样做。您可以使用jmap
转储堆并在VisualVM中查看丢弃的对象。 AFAIK Scala与使用相同的JVM相同。
此问题的常见解决方案是在丢弃对象之前覆盖该对象。要么使对象可变,例如使用char []或StringBuilder,或者使用反射覆盖它。
答案 2 :(得分:1)
从安全的角度来看,你能想象一种方法可以让某人访问JVM内存并获取堆空间的转储,在那里可以找到等待GC的未使用对象吗?
是
如果“坏人”拥有特权或物理访问机器,有多种方法可以做到这一点。
我的意思是:如果我的程序处理敏感数据,我会以不会在执行后留下对这些敏感对象的引用的方式编写我的应用程序...
不完全是。但是,如果您小心,您可以编写应用程序,以便在不再需要时覆盖敏感数据。但是,这预先假定您知道并且可以在JVM中控制包含敏感数据的所有对象。
即使这样,也会有时间窗口,有人可以抓取内存中的数据。 (请注意,任何编程语言都是如此!)
Scala的使用是否会在内存管理和垃圾收集方面发生任何变化?
没有区别。