是否可以从工作人员调用SubtleCrypto方法?

时间:2019-01-21 17:38:29

标签: javascript google-chrome security interface webcryptoapi

我想从一个工作人员那里调用SubtleCrypto的方法。 通常,可以通过窗口上下文中可用的Crypto.subtle属性来实现:

例如:window.crypto.subtle.encrypt()

在工作进程中,窗口不可用,但仍可以通过以下方式访问加密:

self.crypto

但是self.crypto.subtle始终返回未定义。 这是正常行为(例如,出于安全目的而禁用),还是有可能从worker调用SubtleCrypto方法?

我创建了一个JSFiddle来重现行为here。 我使用Chrome。

1 个答案:

答案 0 :(得分:2)

根据Deprecations and Removals in Chrome 60

  

crypto.subtle现在需要安全的来源

     

自Chrome 37以来受支持的Web Crypto API始终适用于非安全来源。由于Chrome一直实行的preferring secure origins for powerful features政策,crypto.subtle现在仅在安全来源上可见。

     

Intent to Remove | Chromium Bug

以下代码放在HTTPS服务器上时,具有crypto.subtle并且可以正常工作

<!DOCTYPE html>
<html>
  <body>
    <input id="start" type="button" value="Start">

    <script>
      function getWorkerJS() {
        var js = `
            onmessage = function(e) {
                var jwkKey = {
                    kty: "oct",
                    k: "lckjnFLIEas7yf65ca6saksjhcajs554s5cajshgGGG"
                };
                crypto.subtle.importKey(
                    "jwk", jwkKey, {name: "AES-CBC"}, true,
                    ['encrypt', 'decrypt', 'wrapKey', 'unwrapKey']
                )
                .then(
                    function (result) {
                        postMessage({ success: true});
                    },
                    function (error) {
                        postMessage({ message: error.message });
                    }
                );
            };
        `;
        var blob = new Blob([js], {"type": "text/plain"});
        return URL.createObjectURL(blob);
      }

      var ww = new Worker(getWorkerJS());

      ww.onmessage = function(msg) {
        console.log(msg.data);
      };

      document.getElementById('start').addEventListener('click', start, false);

      function start() {
        ww.postMessage('start');
      }

    </script>
  </body>
</html>