JavaScript安全:强制删除敏感数据

JavaScript security: force deletion of sensitive data

本文关键字:删除 敏感数据 安全 JavaScript      更新时间:2023-11-06

假设我的应用程序有一段敏感的数据,例如执行本地加密/解密时的加密密钥,我希望在注销时将数据从设备的内存中完全清除。这将防止我的手机落入坏人之手,也防止有人访问当前JS内存来检索解密密钥。

根据Mozilla的说法,JS中的所有数据类型都是不可变的。而且,据我所知,没有办法强制进行垃圾收集,尤其是在浏览器中。是否有任何JS方法可以确保数据完全从内存中清除?

如果没有,使用IndexedDB或WebSQL等其他广泛支持的技术是否允许我清除这些数据?(我假设加密/解密可以只在IndexedDB或WebSQL层进行——这对我来说听起来有点疯狂,因为我认为这些数据仍然存在于某个JS字符串中)。

像ObjectiveC或JAVA这样的母语是唯一的方法吗?

或者,我是不是有点偏执,应该假设JS中任何准备好垃圾收集的东西都会自动及时清除?

是的,字符串等是不可变的,可能会在内存中停留很长一段时间,直到下一个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[]数组,这样您就可以在之后将它们置空。