经过一些研究,似乎建议使用带有 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++ 实现不兼容。
如果不可能以最小的努力实现兼容性,关于选择哪种算法的任何建议,我可能会努力尝试联系这些加密库的开发人员,看看是否有任何关于算法的共识得到作为事实上的标准实施。(是的,我知道这看起来很绝望。)是否有这样的持续努力?