簡體   English   中英

無法驗證在 Go 中創建的 Java 中的 DSA 簽名,反之亦然

[英]Can't verify a DSA signature in Java that was created in Go, and vice versa

我正在嘗試驗證在 Go 中創建的 Java 簽名,反之亦然。 但是,在每種情況下,我都沒有收到錯誤,但在驗證功能上卻是錯誤的。

使用的公鑰和私鑰是相同的,參數也是如此,我通過將 Java 密鑰數據傳遞給 Go 並使用它來簽名和驗證數據來檢查這一點 - 這有效。

我還檢查了傳入的數據(然后是 MD5 散列)在 Java 和 Go 中是否相同,並且生成的散列是否相同(以防萬一) - 它們是。

我知道 Java 使用 ASN1 編碼作為它的簽名,我找到了一個函數來從 Go 提供的單獨的 R 和 S 值重建它,我用它作為模板將 Java 生成的 ASN1 byte[] 拆分為 R和 S 值。 在Java中,如果我拆分並重建ASN1 byte[],我可以驗證簽名,但是無論我做什么,Go都不會,Java也不會驗證Go簽署的簽名。

他們使用的 DSA 算法的版本有區別嗎? 我看到 Java 使用SHA1withDSA並提到它符合 FIPS 186-3 規范

您不必手動拆分 ASN1 [] 字節,您應該使用來自 crypto pkg 的函數。

https://golang.org/pkg/crypto/x509/#Certificate.CheckSignature看起來像是將 SignatureAlgorithm 作為參數(並且 DSAWithSHA1 是有效值)。

好的,DSA 可能有所不同,但對於 RSA 而言,至少解決方案是 Java 不希望首先對值進行哈希處理(我猜它在內部進行了哈希處理),而 GO 則這樣做了,將函數更改為使用 RSA 而不是 DSA 並考慮以上,這工作。

在Java中驗證在golang中生成的rsa.SignPKCS1v15簽名

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM