【问题标题】:Nodejs crypto.publicEncrypt yields different results on different machinesNodejs crypto.publicEncrypt 在不同的机器上产生不同的结果
【发布时间】:2020-09-17 09:03:24
【问题描述】:

我们正在尝试使用 AWS KMS 中的非对称密钥进行加密和解密。密钥配置如下:

在 NodeJS 中,我们使用公钥通过 crypto.publicEncrypt 进行加密:

const encryptRSAPayload = (buffer, publicKey) => {
  const encryptedBuffer = crypto.publicEncrypt(
    {
      key: publicKey,
      oaepHash: 'sha256',
      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
    },
    buffer
  );

  return encryptedBuffer;
};

我们使用这样的函数(在最小复制期间从本地文件中读取公钥):

  const plainText = '12345678910';
  const encrypted = await encryptRSAPayload(Buffer.from(plainText), publicKey);

现在,四个开发人员运行了完全相同的代码(压缩、使用公钥等),正在发生这种情况:

注意:所有开发人员都使用最新的 OSX 系统。

  1. 我们中的两个人可以使用 AWS 解密我们从 encrypt 函数生成的任何内容,而另外两个人不能(失败,IvalidCiphertext: null)来自 AWS。

  2. 其中一台机器无法加密 -> 解密的加密 base64 字符串无法在任何其他机器上解密。

  3. 来自可以加密 -> 解密的机器之一的加密 base64 字符串,可以在任何机器的 aws 中解密。

到目前为止,我花了两天时间在这上面,有点不知所措。有什么想法吗?

【问题讨论】:

  • 密钥错误,编码错误我们无法判断。
  • 有什么办法缩小范围吗?不是错误的关键,因为完全相同的代码可以在不同的机器上运行;包括相同的压缩密钥。
  • 对输入进行二进制比较,以十六进制表示,然后比较模数。如果那些。否则,您通常必须在 OAEP 中试验散列函数,实现不太可能出错。确保例如如果您自己设置键值而不是一次全部解码键,则模数不会被解释为负值。
  • 谢谢,我看看!

标签: node.js amazon-web-services cryptography aws-kms


【解决方案1】:

经过几天的调试,问题解决了。问题源于 OSX 随附的 OpenSSL 版本。对我来说,那是 LibreSSL 2.8,它不包括 OAEP 中使用的一些填充标志,也不将哈希更改为 sha256(而不是 sha1)。

解决办法是:

  1. 通过 Homebrew 安装 OpenSSL 并将 PATH 环境设置为使用该版本而不是出厂版本。
  2. 重新安装任何已安装的节点版本以重新链接到正确的 OpenSSL 版本。

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 2016-10-05
    • 2016-10-15
    • 2021-08-21
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多