java是否可以不安全地访问JVM未使用的对象?
我有个问题要问这边的JVM内部专家
在Java虚拟机中,对象内容存储在堆内存中,直到它们被垃圾回收。通常,GC发生在没有更多可用内存的情况下,因此如果JVM有大量可用空间,GC发生之前可能需要很长时间
从安全性的角度来看,您能想象一种方法,让某人访问JVM内存,并获得堆空间的转储,在那里可以找到等待GC的未使用对象吗
我的意思是:如果我的程序处理敏感数据,并且在执行涉及这些敏感对象的过程后,我以一种不会留下对这些敏感对象的引用的方式编写应用程序,那么恶意软件或系统管理员能否访问堆空间并对其进行分析以找到这些敏感数据
Scala的使用在内存管理和垃圾收集方面有什么改变吗
# 1 楼答案
对
如果“坏蛋”拥有特权或物理访问机器的权限,有多种方法可以实现这一点
不完全是。但是如果你小心,你可以编写你的应用程序来覆盖敏感数据,一旦它不再需要。然而,这前提是您知道并可以控制JVM中包含敏感数据的所有对象
即便如此,还是会有一些时间窗口,人们可以从内存中获取数据。(请注意,任何编程语言都是如此!)
这没什么区别
# 2 楼答案
系统管理员当然可以访问JVM内存。作为最后一个资源,他/她可以转储JVM进程内存并检查它。事实上,你必须信任你将要执行的平台
您可以通过使用
char[]
overString
(这是不可变的)并在离开定义它们的范围之前用零覆盖它们,来缩短此类敏感数据在内存中未加密可用的时间窗口,但在这段时间内,此类数据将以明文形式可用在较低的级别上,可以对内存进行加密,这仍然会在某处留下未加密的密钥。您还可以防止内存页被交换,这无论如何都不会阻止转储,而且如果您的应用程序使用了RAM的相关部分,并且系统没有完全用于此,则可能会对性能造成不良影响。无论如何,这些解决方案只会保护静止的数据,据我所知,没有JVM实现它们
使用Scala不会有太大的改变,因为这是JVM特有的问题,与编译成字节码的源语言无关