如何解决WebCrypto承诺似乎没有被调用
我的代码:
var keyData = `-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----`;
var ciphertext = '...';
// from https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey#PKCS_8_import
function str2ab(str) {
const buf = new ArrayBuffer(str.length);
const bufView = new Uint8Array(buf);
for (let i = 0,strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
keyData = keyData
.replace(/-+[^-]+-+/g,'')
.replace("\n",'')
.replace("\r",'');
keyData = str2ab(window.atob(keyData));
window.crypto.subtle.importKey(
'pkcs8',keyData,{name: 'RSA-OAEP'},true,'decrypt'
).then(function(privateKey) {
alert('this far');
window.crypto.subtle.decrypt(
{
name: "RSA-OAEP"
},privateKey,ciphertext
).then(function(plaintext) {
alert(plaintext);
})
});
它在JSFiddle上(带有完整的私钥和密文):
https://jsfiddle.net/akcq65o7/1/
根据文档window.crypto.subtle.importKey
returns a Promise,因此根据then()
。但是alert('this far');
行从未被调用过。我也没有在JS控制台中遇到任何错误。
有什么想法吗?
解决方法
脚本中有一些小问题,我在下面的发布代码中做了标记:
var keyData = `-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD+80tGPsmRlVBe
+BHRwrBtqKRMzkYBfgmiP6EINNN8NDdXY80KNMb8w+Rx97GgFGPrqVuIPy6RnNRz
Qd77oXmlSqwOPuGIl+x/fga9hL7Z7CfvZz1pqSwBT01OtLNbTMJEMiZtImqOiLIr
1PE8kOVF3B2VssZhwjVy8qppYmix/5XiZM/1nOUvMeiHCq0UAJ4lNA2fLVQkQZSU
pG2HdNIuDHfBBhEGvKdXK4oRwOgeAadpUbOwhUcTU9SSUi4Gvkg6S3WVFdm4seXN
kV2mav9j/oGUF22YO60/y5GDLBEbfsIOpGVLjFnqUJbOu9wBizMTvd5Jt9l7HPAF
GtECNyIHAgMBAAECggEAHXzOTAWfErOOZC2VAgnelhBXUHrbJfkJ7DYnzecuPsNb
U0Q7xt5r1Xhix7u6U6WIGQ2xhISqQjU9bUdFHx2CEFgeplcnhsDrnaNZ7DmaSWJD
DDGIrNvgNxaQ/nVv+TNblL+oKh8869drpB4w+KxZmEbpNRNEVrI7tFvU0fOL4GpP
SBMuPLHYBJ/1rqF0WJS8d/OtQWk5xYc7kqglwfjGkKKilSBp4qBX0B2MPHNKMslj
wqwznXw2KOETIlMgGNl+ArhaF1uO5BNmzuashP3Z4VB6G9hrFFmdMAaRFyi5oY/P
/X6NBM30brS2rlvxzH9VzNLzjdw4MKOpYmKvJTaCAQKBgQDV8adon2eYeTCZD+Ap
nBBwY+lwBAOXGcovSWQuDYYQ5JGawqRE3k1u1l3DWaqNl3lCrNWuWk0jb/Amo4gF
eCd5oFEQUkxRAGgdnMFlLWoMW+Cuoz0kGDr7AqYINuAUggj6MNjQOvsN+USWiLDc
Skj2uruU5f7vqoumfK2jrmcfQQKBgQExETbGCmsta9cVbGNJcfUkRnzUSCHuQa9r
/Bim4q3B6jMFQl4MW/bn+P1ztHSxlwcowM8GfuNQLo9y6u5ICMtC6Kg7ZF6Znmh8
U3sm9KsRlzwaqfqcSSG977871PLvJehJYDVo6UpU1drH1hkLDHa1hSij376nL2hJ
MY9NwMa3RwKBgQCGsg8RKpMBhwNWyoz6BXzAFddJo+1Su3T00oMVD4ShrBYT1omv
pjogFyyPKivb20sH9GLP06CPOBF9ciXYM66+v3VqDjZoJRZn1mJYPgBvaYUKzlFX
IT44/JDlyQ7JOplGU2ydpRSc1pwdHlAjUU2gsS4ab7dS0w/7MLHtxIa+QQKBgQEe
7CjPFOd+/el6Xcn4PvUonB817W30T9U0xBNPiu2P77zy2lvoVeqgfR+sXnJOwVRb
cRSF8HvNYy1KEUnxeEvsbzQjQCB1bXaqUD4JAp+O2OYP0gVCTsosgTwkgwHGCaoy
sQkq1hgyOD0gLO665IsV6NqzXnJLfhwgkztMDt8XawKBgBFqDwEqr9/46iPP7I4D
OTzDCLLKnwx/2X6OtWKNC3h6mCCCp74tYtkpJlXxmD2XIm1W/onvHGvwrZBU8Gp2
eUBF7ioXhH2HUKBPV6X9y3f70jOoD9iDl4ukXbXMFNI8LPzzEBCgJi0VfRPYJuqG
XWYyiGL0bGW4mhUd5/ZFkbWg
-----END PRIVATE KEY-----`;
var ciphertext = 'Sv99/pCslCtU+yAxV0dR+JyQ7yfiVF7+MCHErQEMSL7CyEndKikU7Al0IiRDx6Bd/PmKR6j0mU7WXISptZA1uE82jdDEAhcs9mQtdX18Or4OceIGcqHcHDCZWFQygHI0VMbywVv5C18ydFDuGvHL/dga9ji8IbFW393sEfjx6JtV8Nl4+yiEbee/+dBSQTg+E98asW1Tg59HUNc/fE1r7Muw6hgl7eiF/GxndYg7O957LNH4T3Vi6qutG4mP0frGJ3za6RNkuRrO5Wud3WnDOndHNAoLW7cuMyvzXzfhh3YMPqmkKtRsChJkV+DfPU8HdALfuyP/botQnUGCmwanKg==';
// from https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey#PKCS_8_import
function str2ab(str) {
const buf = new ArrayBuffer(str.length);
const bufView = new Uint8Array(buf);
for (let i = 0,strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
keyData = keyData
.replace(/-+[^-]+-+/g,'')
.replace("\n",'')
.replace("\r",'');
keyData = str2ab(window.atob(keyData));
window.crypto.subtle.importKey(
'pkcs8',keyData,{
name: 'RSA-OAEP',hash: "SHA-256" // Fix 1: Set digest
},true,['decrypt'] // Fix 2: Use brackets [...]
).then(function(privateKey) {
console.log('this far');
window.crypto.subtle.decrypt(
{
name: "RSA-OAEP"
},privateKey,str2ab(window.atob(ciphertext)) // Fix 3: Base64 decode ciphertext and load into ArrayBuffer
).then(function(plaintext) {
console.log(new TextDecoder().decode(plaintext)); // Fix 4: UTF-8 decode plaintext
})
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。