6

我在这里束手无策。有没有办法做到这一点,知道网络工作者无法访问该window对象?请帮忙!

4

2 回答 2

8

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

在 webworkers 中,您可以访问self不包含所有“窗口”属性(尤其是与 dom 无关),但包含 API 方法(如加密函数)。

因此,您可以简单地self.crypto.getRandomValues()从 webworker 中访问。

我以小提琴为例:http: //jsfiddle.net/jbrosi/yj17gomk/

但是请注意,对 webworker 和 back 的调用也会对性能产生很小的影响和最昂贵的加密功能(比如crypto.subtle.encrypt异步,因此根本不应该阻塞你的主线程。

于 2018-01-10T09:02:28.093 回答
2

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

http://cl.ly/image/0r0P3m3D2h07 <- 检查window.crypto

http://cl.ly/image/0G1G0F1Y0d3Z <- 将加密传递给 WebWorker throws 的示例代码。

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

我已经向W3C Web Crypto API Proposal的作者发送了一封电子邮件,您也应该这样做。在这一点上,草案似乎有一些未解决的问题,所以它似乎可以改变。拥有异步 API 或crypto在 Web Worker 中提供 API 对我来说似乎是完全合理的。阻塞主事件循环似乎是一件坏事。

于 2012-10-22T03:10:05.480 回答