Nodejs crypto.publicEncrypt 在不同的机器上产生不同的结果

2024-03-18

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

在 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 解密我们从加密函数生成的任何内容,而另外两个人则不能(失败,并显示 IvalidCiphertext: null)。

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

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

到目前为止,我已经花了两天时间在这上面,但我有点不知道该怎么做。有任何想法吗?


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

解决方案是:

  1. 通过 Homebrew 安装 OpenSSL 并设置 PATH 环境以使用该版本而不是附带版本。
  2. 重新安装任何已安装的节点版本以重新链接到正确的 OpenSSL 版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nodejs crypto.publicEncrypt 在不同的机器上产生不同的结果 的相关文章

随机推荐