经过一些研究,似乎建议使用带有 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/