【问题标题】:Can't verify a DSA signature in Java that was created in Go, and vice versa无法验证在 Go 中创建的 Java 中的 DSA 签名,反之亦然
【发布时间】:2016-04-06 06:42:21
【问题描述】:

我正在尝试验证在 Go 中创建的 Java 签名,反之亦然。但是,在每种情况下,我都没有收到错误,但验证功能是错误的。

使用的公钥和私钥是相同的,参数也是一样,我通过将 Java 密钥数据传递给 Go 并使用它来签名和验证数据来检查这一点 - 这是有效的。

我还检查了传入的数据(然后是 MD5 散列)在 Java 和 Go 中是相同的,并且生成的散列是相同的(以防万一)——它们是。

我知道 Java 使用 ASN1 编码作为它的签名,我找到了一个函数来从 Go 提供的单独的 R 和 S 值重建它,我用它作为模板来拆分由生成的 ASN1 byte[] Java 转换为 Go 的 R 和 S 值。在 Java 中,如果我拆分并重建 ASN1 byte[],我可以验证签名,但无论我做什么,Go 都不会,Java 也不会验证 Go 签名的签名。

他们使用的 DSA 算法版本有区别吗?我看到 Java 使用 SHA1withDSA 并提到它符合 FIPS 186-3 规范

【问题讨论】:

    标签: java go dsa


    【解决方案1】:

    您不必手动拆分 ASN1 [] 字节,您应该使用加密 pkg 中的函数。

    https://golang.org/pkg/crypto/x509/#Certificate.CheckSignature 看起来将 SignatureAlgorithm 作为 arg(并且 DSAWithSHA1 是有效值)。

    【讨论】:

    • 不幸的是 Go 不支持以这种方式解析 DSA 密钥,即使检查签名方法允许 DSA,我切换到 RSA,发现 CheckSignature 即使在检查 go 计算签名时也返回错误
    【解决方案2】:

    好的,DSA 可能有所不同,但对于 RSA,至少解决方案是 Java 不希望在 GO 时首先对值进行散列(我猜它在内部进行散列),将函数更改为使用 RSA 而不是 DSA考虑到上述情况,这行得通。

    Verify rsa.SignPKCS1v15 signature generated in golang in Java

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 2017-03-28
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 2016-12-21
      相关资源
      最近更新 更多