从 Web Worker 内部运行 window.crypto.getRandomValues()

问题描述 投票:0回答:2

我已经无计可施了。知道网络工作人员无法访问

window
对象,有什么方法可以做到这一点吗?请帮忙!

javascript web-worker
2个回答
9
投票

我知道这是一个老问题,但我偶然发现,事情发生了变化。现在大多数浏览器都支持网络工作者中的加密。

在 webworkers 中,您可以访问

self
,它不包含所有“窗口”属性(尤其是与 dom 相关的属性),但包含加密函数等 API 方法。

因此您可以简单地从 webworker 中访问

self.crypto.getRandomValues()

我做了一个小提琴作为例子:http://jsfiddle.net/jbrosi/yj17gomk/

但是请注意,对 webworker 和返回的调用也会对性能产生很小的影响,并且最昂贵的加密函数(例如

crypto.subtle.encrypt
是异步的,因此应该 完全阻止您的主线程。


3
投票

编辑:原来的答案现在已经过时了

来自MDN

[Web Crypto API] 可在 Web Workers 中使用。

访问它查看

self.crypto.getRandomValues()


2012年的原始答案:

没有办法做到这一点,因为 Crypto 类和方法是“本机代码”,这意味着它们是在浏览器中的较低级别实现的,因此我们无法提取代码并将其移动到其他地方。我尝试使用 Chrome 的 Transferrable Objects 对象从当前上下文中删除并传递给工作人员,但这会引发错误。我不认为加密 API 需要与 DOM 耦合(WebWorkers 不会接触 DOM,因为它不是线程安全的),但我以前从未实现过加密。在 Node 中,我们有一个异步 api,所以至少对我来说,它似乎应该是线程安全的。

我创建了一个 WebWorker 脚本来验证,也许,只是也许,Chrome 和 Firefox 只是有不同的实现,不幸的是,我错了。

我已向 W3C Web Crypto API 提案 的作者发送了一封电子邮件,您也应该这样做。目前该草案似乎还有一些未解决的问题,因此它似乎可能会发生变化。在我看来,在 Web Workers 中使用异步 API 或使用

crypto
API 似乎完全合理。阻塞主事件循环似乎是一件坏事。

© www.soinside.com 2019 - 2024. All rights reserved.