带有SHA512的PHP openssl_签名
有没有机会让PHP的openssl_sign方法与SHA512(或任何其他SHA2家族成员)一起工作 如果我使用RSA作为密钥类型(OPENSSL_KEYTYPE_RSA)并通过带有SHA512的PHP openssl_签名,php,openssl,sha512,dsa,Php,Openssl,Sha512,Dsa,有没有机会让PHP的openssl_sign方法与SHA512(或任何其他SHA2家族成员)一起工作 如果我使用RSA作为密钥类型(OPENSSL_KEYTYPE_RSA)并通过 openssl_sign($data, $signature, $privatekey, 'sha512'); 一切正常 但是,当使用OPENSSL_KEYTYPE_DSA时,签名仍然为空 在一次会议上,我发现: “如果希望使用DSA算法对数据进行签名或验证,则必须使用dss1摘要。” 所以我尝试了DSA: open
openssl_sign($data, $signature, $privatekey, 'sha512');
一切正常
但是,当使用OPENSSL_KEYTYPE_DSA时,签名仍然为空
在一次会议上,我发现:
“如果希望使用DSA算法对数据进行签名或验证,则必须使用dss1摘要。”
所以我尝试了DSA:
openssl_sign($data, $signature, $privatekey, 'dss1');
而且效果很好
我更喜欢使用DSA,因为它创建的签名更短,更适合我的用例。
然而,我担心的是DSS1基本上是SHA1,不应该再使用了。这是否也适用于与DSA的组合?有没有办法解决这个问题,并将DSA与SHA512一起使用?这不是一个真正的答案,但我在评论中读不懂 OpenSSL手册页说明已过时(注)。OpenSSL 0.9.8使用“EVP”API(命令行dgst和其他API一起选择了哈希和PKalg,因此只能使用SHA1执行DSA(由原始的无后缀FIPS指定),并将其称为DSS1(如您所发现的)。此外,它只能生成子组(q)大小为160的DSA参数,尽管FIP以64的步长表示512到1k,但它可以生成大于1k的组(p)大小(这在1995年很好) 在1.0.0和1.0.1中,使用新的和改进的API,您可以生成所有FIPS186-3参数大小(1k/160、2k/224、2k/256、3k/256),并使用4个原始SHA-2散列中的任何一个对任何正常大小的DSA进行签名/验证,其中每个FIP会截断一个大于q(子组)的散列,因此基本上是浪费的。(IIRC FIPS180-4中添加的3个SHA-2“斜杠”变体尚未在OpenSSL中作为哈希实现,更不用说签名了。) 正如您已经明确确认的那样,OpenSSL自0.9.8以来支持RSA,并且(我非常肯定)支持从MD2到SHA512的所有哈希。但SHA512就像施奈尔的万里高赌注;根据NIST和ECRYPT(见www.keylength.com)的数据,为了使RSA保持其标称强度,您需要超过15kbits,这将是缓慢的 ECDSA产生同样小的特征值,预计在现在或很快想要的更高强度下可以更好地扩展 如果、何时以及如何在PHP中提供(或如何提供),我一无所知 和加密一样,如果您与一个或多个其他系统进行互操作,请检查它们的功能
(注意)在上个月(咳嗽,咳嗽)的兴奋之后,从事OpenSSL工作的人数猛增,有些人甚至在做一些枯燥的工作,如doc和测试,这些工作已经落后了很多年,因此我将对此提出一个修复请求。只是暗中试探,但SHA160可用吗?它匹配SHA1的散列长度,因此可以兼容,但更安全。据我所知,没有SHA160这样的东西。SHA-0和SHA-1都使用160位密钥。这不是标准的,但一些库提供了被截断为160位的SHA256,比如SHA224,但更短。如果有办法将其传递给DSA,您可以自己进行截断。感谢您分享有关此主题的一些背景信息。我投了你一票,但正如你已经提到的,这并不是我问题的答案