Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 来自PEM的SublecryPTO导入密钥_Javascript_Ionic Framework - Fatal编程技术网

Javascript 来自PEM的SublecryPTO导入密钥

Javascript 来自PEM的SublecryPTO导入密钥,javascript,ionic-framework,Javascript,Ionic Framework,我正在尝试使用Ionic中的SublecryptoWebAPI使用公钥加密数据。我正在以PEM格式导入密钥,然后将其传递到window.crypto.minute.importKey,然后将该结果使用到window.crypto.minute.encrypt window.crypto.minute.importKey似乎有问题-当我尝试导入密钥时,我得到了一个未捕获(承诺):DataError 我目前正在使用以下方法导入密钥: //Get the public key in CryptoKey

我正在尝试使用Ionic中的SublecryptoWebAPI使用公钥加密数据。我正在以PEM格式导入密钥,然后将其传递到
window.crypto.minute.importKey
,然后将该结果使用到
window.crypto.minute.encrypt

window.crypto.minute.importKey
似乎有问题-当我尝试导入密钥时,我得到了一个
未捕获(承诺):DataError

我目前正在使用以下方法导入密钥:

//Get the public key in CryptoKey format
let importedPublicKey = await window.crypto.subtle.importKey(
    "pkcs8",
    this.pemPublicToArrayBuffer(serverPublicKey),
    {
        name: "RSA-OAEP",
        hash: {name: "SHA-256"}
    },
    true,
    []
);

private pemPublicToArrayBuffer(pem) {
  var b64Lines = this.removeLines(pem);
  var b64Prefix = b64Lines.replace('-----BEGIN PUBLIC KEY-----', '');
  var b64Final = b64Prefix.replace('-----END PUBLIC KEY-----', '');

  return this.base64ToArrayBuffer(b64Final);
}

private base64ToArrayBuffer(b64) {
  var byteString = window.atob(b64);
  var byteArray = new Uint8Array(byteString.length);
  for (var i = 0; i < byteString.length; i++) {
    byteArray[i] = byteString.charCodeAt(i);
  }

  return byteArray;
}
//获取加密密钥格式的公钥
让importedPublicKey=等待window.crypto.minute.importKey(
“pkcs8”,
此.pemplictoarraybuffer(服务器公钥),
{
名称:“RSA-OAEP”,
哈希:{name:“SHA-256”}
},
是的,
[]
);
私人pemPublicToArrayBuffer(pem){
var b64Lines=此移除线(pem);
var b64Prefix=b64行。替换('----开始公钥---','');
var b64Final=b64前缀.replace('----结束公钥---','');
将此.base64返回到ArrayBuffer(B64最终);
}
专用基站64ToArrayBuffer(b64){
var byteString=window.atob(b64);
var byteArray=新的Uint8Array(byteString.length);
for(var i=0;i

有人知道为什么PEM公钥的密钥导入失败吗?

我自己也花了很长时间来解决这个错误,现在我相信我可以给你(和其他任何人)一些很好的建议

  • 您正在将“pkcs8”作为一种格式传递给importKey方法,但是如果您正在导入公钥,则该格式很可能是“spki”(SubjectPublicKeyInfo)一种公钥的特殊格式,而“pkcs8”应该用于私钥。这就引出了下一点:

  • 你从哪里弄到这把钥匙的?如果您使用OpenSSL cli导出公钥(OpenSSL rsa-pubout-in priv.pem-out pub.pem),那么您将获得“spki”格式的密钥(默认)

  • 如果要导入公钥,则应将[“encrypt”]作为“usages”参数传递给importKey(而不是空数组),否则将出现以下错误之一:“SyntaxError:无法使用指定的密钥用法创建密钥”(为密钥指定的用法错误)或“InvalidAccessError:key.usages不允许此操作”(usages的空数组)。 这里需要记住的是,公钥只能用于[“加密”],私钥只能用于[“解密”]。虽然我没有尝试导入密钥对,但据我所知,您应该将“pkcs8”作为一种格式传递,并将[“加密”、“解密”]作为用法传递

  • 即使您正确地设置了以上所有内容,您仍然可能会得到令人讨厌的“Uncaught(in promise):DataError”,对我来说,这是由于格式不匹配,我一直在用“spki”传递PKCS#1 RSAPublicKey格式的密钥“参数。因此,您可能应该从检查密钥开始,从中获得确切的格式和算法细节

  • 希望这对别人有帮助。 伊万