有没有机会让PHP的openssl_sign方法与SHA512(或任何其他SHA2系列成员)一起使用?
如果我使用RSA作为密钥类型(OPENSSL_KEYTYPE_RSA)并通过
签名openssl_sign($data, $signature, $privatekey, 'sha512');
一切正常。
但是,当使用OPENSSL_KEYTYPE_DSA时,签名仍为空。
在OpenSSL help page我发现了这个: “如果您希望使用DSA算法签署或验证数据,则必须使用dss1摘要。”
所以我尝试使用DSA:
openssl_sign($data, $signature, $privatekey, 'dss1');
它工作正常。
我更喜欢使用DSA,因为它创建了更短的签名,更适合我的用例。 不过我担心的是DSS1基本上是SHA1,不应该再使用了。这对于与DSA的组合也有效吗?有没有办法解决这个问题并将DSA与SHA512一起使用?
答案 0 :(得分:1)
不是一个真正的答案,但不仅仅是我可以在评论中使用。
该OpenSSL联机帮助说明已过时(注释)。 OpenSSL 0.9.8使用“EVP”API,命令行dgst等,选择散列和PKalg,因此只能用SHA1进行DSA(由原始无后缀FIPS指定)并称之为DSS1(如你发现了)。此外,它只能生成子组(q)大小为160的DSA参数,尽管它可以执行组(p)大小> 1k尽管FIPS以64步为单位说512到1k(这与1995年一样好)。
在1.0.0和1.0.1中使用新的和改进的API,您可以生成所有FIPS186-3参数大小(1k / 160,2k / 224,2k / 256,3k / 256)并签署/验证任何理智的DSA使用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工作的人数有所增加,有些人甚至做了像医生和测试那样枯燥乏味的数据已经落后多年,所以我会投入对此提出修复请求。