我想从一个工作人员那里调用SubtleCrypto的方法。 通常,可以通过窗口上下文中可用的Crypto.subtle属性来实现:
例如:window.crypto.subtle.encrypt()
在工作进程中,窗口不可用,但仍可以通过以下方式访问加密:
self.crypto
但是self.crypto.subtle
始终返回未定义。
这是正常行为(例如,出于安全目的而禁用),还是有可能从worker调用SubtleCrypto方法?
我创建了一个JSFiddle来重现行为here。 我使用Chrome。
答案 0 :(得分:2)
根据Deprecations and Removals in Chrome 60:
crypto.subtle现在需要安全的来源
自Chrome 37以来受支持的Web Crypto API始终适用于非安全来源。由于Chrome一直实行的preferring secure origins for powerful features政策,
crypto.subtle
现在仅在安全来源上可见。
以下代码放在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>