Можно ли вызвать методы SubtleCrypto с рабочего? - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы вызвать методы SubtleCrypto от работника. Обычно это возможно через свойства Crypto.subtle, доступные в контексте окна:

Например: window.crypto.subtle.encrypt()

В работнике окно недоступно, но крипто-доступ все еще доступен следующим образом:

self.crypto

Однако self.crypto.subtle всегда возвращает неопределенное значение. Это нормальное поведение (например, отключено в целях безопасности) или есть возможность вызывать методы SubtleCrypto с рабочего?

Я создал JSFiddle, который воспроизводит поведение здесь . Я использую Chrome.

1 Ответ

0 голосов
/ 22 января 2019

Согласно Устаревания и удаления в Chrome 60 :

crypto.subtle теперь требует безопасного источника

Web Crypto API , который поддерживается начиная с Chrome 37, всегда работал на небезопасных источниках.Из-за давней политики Chrome , предпочитающей безопасные источники для мощных функций , crypto.subtle теперь виден только при безопасных источниках.

Намерение удалить | 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>
...