1

经过一些研究,似乎建议使用带有 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++ 实现不兼容。

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

4

1 回答 1

4

您当前正在使用 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 签名相比具有不太理想的属性。

于 2013-02-24T19:16:00.020 回答