假设我的应用有一段敏感数据,例如一个加密 key ,因为它正在执行本地加密/解密,我希望在注销时将数据从我的设备内存中完全清除。这将防止我的手机落入坏人之手,防止有人访问当前 JS 内存以检索解密 key 。
According to Mozilla , JS 中的所有数据类型都是不可变的。而且,据我所知,没有办法强制进行垃圾回收,尤其是在浏览器中。有没有什么 JS 方法可以确保数据从内存中完全清除?
如果不能,是否可以使用其他一些广泛支持的技术(如 IndexedDB 或 WebSQL)清除这些数据? (我假设加密/解密可以专门在 IndexedDB 或 WebSQL 层完成——这对我来说听起来有点疯狂,因为我假设这些数据仍然驻留在某个 JS 字符串中)。
像 ObjectiveC 或 JAVA 这样的母语是唯一的出路吗?
或者,我是不是多疑了,应该假设在 JS 中准备好进行垃圾收集的任何东西都会在及时的庄园中自动清除?
最佳答案
是的,字符串等是不可变的,可能会在内存中保留很长时间,直到下一个 GC 周期。
为了克服这个问题,您将 secret 存储在一个可变对象中。例如,在一个基本数组中:
var secret = ['s','e','c','r','e','t'];
现在,您可以简单地删除信息,即清空数组元素:
var len = secret.length
for (var i=0; i<len; ++i) {
secret[i] = '0'
}
这就是为什么许多使用处理密码和 secret 的 Java API 需要一个 char[]/byte[] 数组,以便您之后可以将它们清空。
关于JavaScript 安全 : force deletion of sensitive data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28511970/