我在这里束手无策。有没有办法做到这一点,知道网络工作者无法访问该window
对象?请帮忙!
2 回答
我知道这是一个老问题,但我偶然发现,事情发生了变化。大多数浏览器现在确实支持网络工作者中的加密。
在 webworkers 中,您可以访问self
不包含所有“窗口”属性(尤其是与 dom 无关),但包含 API 方法(如加密函数)。
因此,您可以简单地self.crypto.getRandomValues()
从 webworker 中访问。
我以小提琴为例:http: //jsfiddle.net/jbrosi/yj17gomk/
但是请注意,对 webworker 和 back 的调用也会对性能产生很小的影响和最昂贵的加密功能(比如crypto.subtle.encrypt
异步,因此根本不应该阻塞你的主线程。
没有办法做到这一点,因为 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 对我来说似乎是完全合理的。阻塞主事件循环似乎是一件坏事。