今天,JavaScript的加密库存在sjcl,因此可能存在这样的情况 密码/密钥/秘密/敏感数据存储在JavaScript中的变量中。
我不想冒这个敏感数据泄露/泄露的风险,因此我非常想知道是否有办法可靠地擦除Javascript中的变量,以便JavaScript引擎使用的内存不会有有关他数据的任何剩余信息?例如,我不想依赖某些GC来懒散地擦除数据等。
答案可能包含一个杀死/擦除变量的示例代码,以及解释何时(以及是否存在JavaScript实现浏览器类型/ Nodejs的差异)它是否相信数据已被删除?
否则,如果任务不可能,我会很感激解释为什么会这样,也接受这个作为答案
目标不是保护网页用户不访问脚本变量(我想这不可能)。目标是更多地保证javascript引擎的内存在必要之后不保留数据的影子/缓存副本。我确实想要让数据消失,以便没有人(攻击者软件)可以通过查看与Javascript变量相关联的内存来获取秘密数据。
答案 0 :(得分:2)
JavaScript是垃圾收集。此外,没有内置确定性资源管理的机制。您可以创建一个,但资源必须是外部的。
即使您构建了这样的机制(例如,在Node中使用C ++外部模块),引擎也无法确保何时清除其内存副本。您必须手动分配资源数据的相同变量部分,并自己将其替换为垃圾。那可能可以正常工作,但在引擎级别仍然没有保证。
这不是一个问题,JavaScript实现是为了在这一点上做得好。没有SecureString
。这就是说 - smart people正在研究ECMAScript(JS标准)的变体,它们为您提供了更强大的保证。这是解决问题的良好开端(但还没有这样的保证)。
我甚至不想开始使用浏览器,浏览器扩展可以轻松获得比你更好的钩子并在Function.prototype.call
上书写并挂钩每个函数调用,JavaScript内置了非常强大的AOP功能,在这种情况下更糟糕。
一种可能的解决方案是在使用加密RAM的VM中运行整个程序,但我反对像这样滚动你自己的加密。通常,攻击者不应该首先访问您的程序的RAM,如果他们这样做,他们可以安装浏览器扩展:)