1

是否有机会让 PHP 的 openssl_sign 方法与 SHA512(或任何其他 SHA2 家族成员)一起使用?

如果我使用 RSA 作为密钥类型(OPENSSL_KEYTYPE_RSA)并通过

openssl_sign($data, $signature, $privatekey, 'sha512');

一切正常。

但是,当使用 OPENSSL_KEYTYPE_DSA 时,签名保持为空。

OpenSSL 帮助页面上,我发现:“如果您希望使用 DSA 算法签名或验证数据,则必须使用 dss1 摘要。”</p>

所以我用 DSA 尝试了这个:

openssl_sign($data, $signature, $privatekey, 'dss1');

它工作得很好。

我更喜欢使用 DSA,因为它创建的签名更短,更适合我的用例。但是我担心的是 DSS1 基本上是 SHA1,不应该再使用了。这也适用于与 DSA 的组合吗?有没有办法解决这个问题并将 DSA 与 SHA512 结合使用?

4

1 回答 1

2

不是真正的答案,但超出了我在评论中的可读性。

该 OpenSSL 手册页注释已过时(注释)。OpenSSL 0.9.8 使用“EVP”API(命令行 dgst 等)选择了 hash 和 PKalg,因此只能使用 SHA1 执行 DSA(由原始无后缀 FIPS 指定)并将其称为 DSS1(如你发现了)。此外,它只能生成子组 (q) 大小为 160 的 DSA 参数,尽管它可以执行组 (p) 大小 > 1k,尽管 FIPS 以 64 的步长表示 512 到 1k(这在 1995 年很不错)。

在具有新的和改进的 API 的 1.0.0 和 1.0.1 中,您可以生成所有 FIPS186-3 参数大小(1k/160、2k/224、2k/256、3k/256),并使用任何4 个原始 SHA-2 哈希,其中长于 q(子组)的哈希在每个 FIPS 中被截断,因此基本上被浪费了。(IIRC FIPS180-4 中添加的 3 个 SHA-2 “斜线”变体尚未在 OpenSSL 中实现为哈希,更不用说签名了。)

正如您显然已经确认的那样,自 0.9.8 以来的 OpenSSL 支持 RSA(我很确定)从 MD2 到 SHA512 的所有哈希。但是 SHA512 就像 Schneier 的一英里高的赌注;为了使 RSA 保持其标称强度,根据 NIST 和 ECRYPT(请参阅 www.keylength.com),您需要超过 15kbits,这将是 sloooow。

ECDSA 产生同样小的特征值,并有望在现在或很快需要的更高强度下更好地扩展。

如果,何时以及如何(或这些)在 PHP 中可用,我一无所知。

如果您与一个或多个其他系统进行互操作,那么与加密一样,也要检查它们的功能。

(注)继上个月(咳咳)的兴奋之后,从事 OpenSSL 工作的人数猛增,有些人甚至在做一些无聊的事情,比如已经滞后多年的文档和测试,所以我会提出一个修复请求对此。

于 2014-06-06T09:16:51.313 回答