从Web Worker中运行window.crypto.getRandomValues()

时间:2012-10-22 02:41:14

标签: javascript web-worker

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

2 个答案:

答案 0 :(得分:3)

我知道这是一个古老的问题,但我偶然发现并改变了一切。大多数浏览器现在都支持webworkers中的加密。

在网络工作者中,你可以访问不包含所有“窗口”属性的self(特别是没有与dom相关的属性),但是拥有像加密函数这样的API方法。

因此,您只需从网络工作者中访问self.crypto.getRandomValues()即可。

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

但请注意,对webworker和back的调用也会产生较小的性能影响,而且最昂贵的加密函数(如crypto.subtle.encrypt)是异步的,因此 根本不会阻止您的主线程。

答案 1 :(得分:2)

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

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

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

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

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