我试图验证在Go中创建的Java签名,反之亦然。但是,在每种情况下,我都没有收到任何错误,但验证函数是错误的。
正在使用的公钥和私钥是相同的,参数也一样,我通过将Java密钥数据传递给Go并使用它来签署和验证数据来检查这一点 - 这是有效的。
我还检查过传入的数据(当时是MD5哈希)在Java和Go中是相同的,并且得到的哈希是相同的(以防万一) - 它们是。
我知道Java使用ASN1编码进行签名,我找到了一个从Go提供的单独R和S值重建它的函数,我用它作为模板来分割ASN1字节[]生成的[]为Go的R和S值。在Java中,如果我拆分并重建ASN1 byte [],我可以验证签名,但无论我做什么,Go都不会,并且Java不会验证Go签名的签名。
他们使用的DSA算法版本有区别吗?我看到Java使用SHA1withDSA
并且提到它符合FIPS 186-3规范
答案 0 :(得分:0)
您不必手动分割ASN1 []字节,您应该使用crypto pkg中的函数。
https://golang.org/pkg/crypto/x509/#Certificate.CheckSignature看起来像将SignatureAlgorithm作为arg(而DSAWithSHA1是一个有效值)。
答案 1 :(得分:-1)
好吧,DSA可能会有所不同,但对于RSA,至少解决方案是Java不希望首先对值进行哈希处理(我猜它内部哈希),而GO做了,更改函数使用RSA而不是DSA考虑到上述情况,这很有效。
Verify rsa.SignPKCS1v15 signature generated in golang in Java