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

JavaScript security: force deletion of sensitive data

假设我的应用有一段敏感数据,例如一个加密密钥,因为它正在执行本地 encryption/decryption,我希望数据在注销时从我的设备内存中完全刷新。这将防止我的 phone 落入坏人之手并防止有人访问当前 JS 内存以检索解密密钥。

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

如果不能,是否可以使用其他一些广泛支持的技术(如 IndexedDB 或 WebSQL)清除这些数据? (我假设 encryption/decryption 可以专门在 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[] 数组,以便您之后可以将它们清零。