安全签名算法的兼容性

时间:2013-02-24 13:04:43

标签: node.js openssl rsa signature botan

经过一些研究后,似乎建议使用带有PSS填充的RSA,因为其安全属性已知是好的。问题是签名算法很难具有兼容性,特别是有这样的要求。

我想要达到的目标是至少在以下环境中进行签名和验证:

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

在PolarSSL和其他人身上兼容可能也很有趣。

node.js加密页面中有一个关于创建和验证签名的示例。这很好用,但我需要与Botan EMSAx(SHA256)兼容,并且真的认为应该用RSA-PSS之类的东西来填充签名。节点示例页面仅显示'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 ++实现不兼容。

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

1 个答案:

答案 0 :(得分: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签名相比具有不太理想的属性。