node.js - 安全签名算法的兼容性

标签 node.js openssl rsa signature botan

经过一些研究,似乎建议使用带有 PSS 填充的 RSA,因为众所周知,其安全特性良好。问题是签名算法很难兼容,尤其是在这样的要求下。

我想要实现的是至少在以下环境中进行签名和验证:

  • 牡丹
  • OpenSSL
  • 加密++
  • Node.js(使用 OpenSSL)

在 PolarSSL 和其他方面的兼容性也可能很有趣。

node.js 加密页面中有一个关于创建和验证签名的示例。这很好用,但我需要与 Botan EMSAx(SHA256) 兼容,并且确实认为应该使用 RSA-PSS 之类的东西来填充签名以确保安全。 Node 示例页面仅显示'RSA-SHA256',但没有使用填充。

PSS填充可以通过使用OpenSSL来实现:

openssl dgst -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 \
 -sign rsa.key -out data.txt.sha256 data.txt

我的测试代码如下所示:

var s = crypto.createSign('RSA-SHA256');
var key = fs.readFileSync('rsa.key').toString();

s.update(message);

var signature = s.sign(key, 'base64');

但是它为相同的输入产生相同的输出,这不是我想要的,并且显然与我使用 Botan 的 C++ 实现不兼容。

如果不可能以最小的努力实现兼容性,关于选择哪种算法的任何建议,我可能会努力尝试联系这些加密库的开发人员,看看是否就某个算法有任何共识算法作为事实上的标准来实现。 (是的,我知道这看起来很绝望。)是否有这样的持续努力?

最佳答案

您当前正在使用 PSS 签名格式,而 Node.js 几乎肯定使用 PKCS#1 v1.5 兼容签名 - 如果我查看当前的代码,Node.js 似乎仅限于这些签名。一个区别确实是 PSS 生成的签名包含随机组件,而 PKCS#1 v1.5 兼容签名则不包含随机组件。

虽然 PSS 签名当然是首选,但您似乎唯一的选择是恢复到 Botan 的 PKCS#1 v1.5 兼容签名,或者在 Node.js 中实现 PSS 签名。 PKCS#1 v1.5 签名应该仍然是安全的,尽管与 PSS 签名相比,它们的属性不太理想。

关于node.js - 安全签名算法的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15051996/

相关文章:

node.js - Socket.io 与 node.js 中的网络类

node.js - 通过 VNC 连接到 Android 模拟器

javascript - 尝试使用 socket.io 时出错

openssl - 尝试将 .pfx 转换为 .pem 时,Mac 验证错误 : invalid password?

reflection - 从 Golang 类型中提取未导出字段的正确方法是什么?

java - 从 Java 中的已知参数创建 RSA key

javascript - 来自 ws 的 Node.js 和 Socket.io UTF8 验证类型错误

openssl - JBOSS应用程序SSL错误: Alias name does not identify a key entry

linux - 将证书从 Nginx 服务器传递到另一个 Nginx 服务器以进行客户端身份验证

openssl - 在 C++Builder 中使用 OpenSSL