javascript - 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
返回一个 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
})
});
推荐阅读
- python - 在微信中检索 mediaid 时出现 503 错误代码?
- keycloak - 将 auth0 与 keycloak 一起使用
- angularjs - 使用AngularJS控制器在第三个文本框中的文本框中显示两个数字的总和
- c - curl:RSA_padding_check_PKCS1_type_1:无效填充
- google-chrome - 为什么 Chrome 开发者工具的网络标签显示的大小比下载的文件大小要小很多?
- c++ - 无法在 C++ 中为停车场 OOP 声明抽象类型的变量
- c - 如何在 mmaped 内存中删除脏页并为快速 munmap 做准备?
- php - 如何在foreach循环中使用mysql左连接和回显变量
- apache-poi - Domino V10 和 POI
- bootstrap-4 - 设置所有等高的卡片 (mdbootstrap)