【问题标题】:Compatibility of a secure signature algorithm安全签名算法的兼容性
【发布时间】:2013-02-24 13:04:42
【问题描述】:

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

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

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

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

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

使用 OpenSSL 可以实现 PSS 填充:

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++ 实现不兼容。

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

【问题讨论】:

    标签: node.js openssl rsa signature botan


    【解决方案1】:

    您当前使用的是 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 的 crypto lib 或某种更高级别的解决方案。我有点害怕自己开始实施加密算法,但也许时机已到。
    • 说签名兼容性还处于起步阶段似乎很奇怪,因为 PKCS#1 v1.5 兼容性可能是 100%,并且仍然主要用于 SSH、TLS 等。签名兼容性来仅当您有阻止安全使用 PKCS#1 v1.5 的特殊需求时才会出现问题。
    • @Nakedible,我的建议是我找不到 PSS 填充的兼容实现,这似乎是要走的路。你似乎对这个主题很了解;是否有一个标准集,其中一组重要的加密库正在实施,允许使用不同的算法编写和验证签名数据结构? ECDSA(不同曲线)/RSA/其他?
    • @hg。我建议提出一个单独的问题,因为我不是这方面的专家。但是,最好的办法是查看这些库的常见用法——这通常意味着大型 CA 机构支持的 SSL 证书的所有算法通常都得到很好的支持。很可能是 RSA+DSA+ECDSA(p256)。
    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多