让我们说我的应用程序有一个敏感的数据,例如加密密钥,因为它正在执行本地加密/解密,我希望在注销时从我的设备内存中完全刷新数据。这样可以防止我的手机落入坏人之手,有人访问当前的JS内存以检索解密密钥。
According to Mozilla,JS中的所有数据类型都是不可变的。而且,据我所知,没有办法强制垃圾收集,尤其是在浏览器中。是否有任何JS方法可以确保数据完全从内存中清除?
如果没有,是否可以使用其他广泛支持的技术(如IndexedDB或WebSQL)来清除这些数据? (我假设加密/解密可以在IndexedDB或WebSQL层专门完成 - 这对我来说听起来有点疯狂,因为我认为这些数据仍会存在于某个地方的JS字符串中)。
像ObjectiveC或JAVA这样的母语是唯一的方法吗?
或者,我是偏执狂,应该假设任何准备好在JS中进行垃圾收集的东西都会被自动清除?
答案 0 :(得分:2)
是的,字符串等是不可变的,可能会长时间保留在内存中,直到下一个GC循环。
要解决此问题,请将秘密存储在可变对象中。例如,在基本数组中:
var secret = ['s','e','c','r','e','t'];
现在,您可以简单地删除数组元素的信息:
var len = secret.length
for (var i=0; i<len; ++i) {
secret[i] = '0'
}
为什么许多使用密码和秘密处理的Java API都需要char [] / byte []数组,以便之后可以将它们清空。