【问题标题】:SubtleCrypto importKey from PEM来自 PEM 的 SubtleCrypto importKey
【发布时间】:2019-07-11 13:23:53
【问题描述】:

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

window.crypto.subtle.importKey 似乎有问题 - 当我尝试导入密钥时,我得到了 Uncaught (in promise): 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;
}

有没有人知道为什么使用 PEM 公钥导入密钥失败?

【问题讨论】:

    标签: javascript ionic-framework


    【解决方案1】:

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

      1234563 “pkcs8”应该用于 PRIVATE 密钥。这将我们带到了下一点:
    1. 您从哪里获得此密钥?如果您使用 OpenSSL cli (openssl rsa -pubout -in priv.pem -out pub.pem) 导出公钥,那么您将获得“spki”格式的密钥(默认格式)。

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

    3. 即使您正确设置了上述所有内容,您仍然可能会收到讨厌的“未捕获(承诺):DataError”,对我来说这是由于格式不匹配,我一直在传递PKCS#1 RSAPublicKey 格式,带有“spki”参数。因此,您可能应该从检查您的密钥开始,以从中获取准确的格式和算法细节。

    希望这对某人有所帮助。 伊万

    【讨论】:

    • 我如何知道我传递的密钥格式是否正确?
    • 在知道如何解析之前必须查看二进制格式真的很糟糕。应该怎么做呢?
    猜你喜欢
    • 2018-01-09
    • 2021-02-27
    • 1970-01-01
    • 2021-08-10
    • 2020-03-17
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    相关资源
    最近更新 更多