gpt4 book ai didi

android - Web Crypto API crypto.subtle 在 Apache Cordova 中未定义

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:19 25 4
gpt4 key购买 nike

我正在使用 Cordova 和 forge library和浏览器的 Web Crypto API执行 signimportKey操作。尽管如此,Android 设备上的 Web Crypto API 仅提供 crypto.getRandomValues() SubtleCrypto 未定义 (crypto.subtle)。所以我想添加 Web Crypto API shrim及其依赖Promiz将修复此引用丢失,但没有任何改变。有什么想法吗?

在 PC 上调试 Chrome 52.0.2743.116 提供了完整的 Web Crypto API,但是在 Android 设备上调试 Chrome 版本 52.0.2743.98 和 Android 4.4.4。 Web API 仅限于 crypto.getRandomValues()。

我基本上是在重写 How to load a PKCS#12 Digital Certificate with Javascript WebCrypto API 的答案

代码示例:

在 index.html 中

<script src="lib/promiz.min.js"></script>
<script src="lib/webcrypto-shim.js"></script>

在 javascript 文件中

//working with forge without issue
var pkcs12Der = forge.util.decode64(pk);
var pkcs12Asn1 = forge.asn1.fromDer(pkcs12Der);
var pkcs12 = forge.pkcs12.pkcs12FromAsn1(pkcs12Asn1, false, "password");
console.log(pkcs12);

privateKey = null;
// load keypair and cert chain from safe content(s)
for (var sci = 0; sci < pkcs12.safeContents.length; ++sci) {
var safeContents = pkcs12.safeContents[sci];

for (var sbi = 0; sbi < safeContents.safeBags.length; ++sbi) {
var safeBag = safeContents.safeBags[sbi];

// this bag has a private key
if (safeBag.type === forge.pki.oids.keyBag) {
//Found plain private key
privateKey = safeBag.key;
} else if (safeBag.type === forge.pki.oids.pkcs8ShroudedKeyBag) {
// found encrypted private key
privateKey = safeBag.key;
} else if (safeBag.type === forge.pki.oids.certBag) {
// this bag has a certificate...
}
}
}

//function for importingKey
function _importCryptoKeyPkcs8(privateKey, extractable) {
var privateKeyInfoDerBuff = _privateKeyToPkcs8(privateKey);

//import key will not work due to missing reference crypto.subtle
return window.crypto.subtle.importKey(
'pkcs8',
privateKeyInfoDerBuff, {
name: "RSASSA-PKCS1-v1_5",
hash: {
name: "SHA-256"
}
},
extractable, ["sign"]);

}

_importCryptoKeyPkcs8(privateKey, true).
then(function(cryptoKey) {
//sign will not work due to missing reference crypto.subtle
window.crypto.subtle.sign({
name: "RSASSA-PKCS1-v1_5"
},
cryptoKey,
digestToSignBuf)
.then(function(signature2) {

});
});

最佳答案

SubtleCrypto 应该在不安全的上下文中未定义。我猜你使用的是 http 协议(protocol)。切换到 https 即可解决问题。我曾经因此浪费了 4 个小时的开发时间。

编辑:如果 SubtleCrypto 未定义并且您在其上调用了某个函数,您会期望出现错误消息,但不会出现任何错误、警告或任何内容。什么都没有。这就像调用一个空函数。调试时真的很痛苦。

关于android - Web Crypto API crypto.subtle 在 Apache Cordova 中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39062861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com