我一直在嘗試使用go加密包驗證在Node中生成的簽名。簽名是從函數生成的。然后,在前進中,我正在驗證這一點,但它總是失敗。這些私鑰/公鑰可以安全地共享,因為它們是為本示例生成的。我能夠在Node中從簽名運行驗證而沒有問題,但我不確定go中發生了什么導致它失敗。createSig()verifySig()在節點中生成簽名function createSig() { const crypto = require("crypto"); function fromBase64(base64) { return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); } const PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----\nMIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAyX1juQ2AVhS5NdKl\nJL5g4A+fPLUUWh2Tq1+f0Z1rb1dpCZ+RXECJAdW4ocsl5n24QtmzD66Z/s1bs+B5\nOyD4KwIDAQABAkBqxbiXsrDkbNzsybBbtUsO0Rh4Chk729qKAQVnBf2NpRmz3KAf\nMXP5M9Wr9HlD1PT8WUUaYvGtabbbkXTFq+pBAiEA+T2Lja3seY2NUxsR0Qi211Ug\nKCd820+5Tjft1XMf1aECIQDO9FDm5asV3q60YvqpifSawiS2JH/DS7Whg4X0M64i\nSwIhAPaKTY/g+eim/6O0RCRspUhNeRifLt9VdiyMIGOilFvhAiAJxgH4FYqR2tVX\nUYFS9l/l2xtOusSJ3Y5zVTnDQZmMpwIhAMibeam8MvHMr3FjTqE5CwOgsg6zXiWZ\nFA9ZnEINP5jz\n-----END PRIVATE KEY-----"; var message = "test"; var signer = crypto.createSign("RSA-SHA256"); signer.update(message); return fromBase64(signer.sign(PRIVATE_KEY, "base64"));}在 Go 中驗證func verifySig(message, signature string) (bool, error) { var key = "-----BEGIN PUBLIC KEY-----\nMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMl9Y7kNgFYUuTXSpSS+YOAPnzy1FFod\nk6tfn9Gda29XaQmfkVxAiQHVuKHLJeZ9uELZsw+umf7NW7PgeTsg+CsCAwEAAQ==\n-----END PUBLIC KEY-----" block, _ := pem.Decode([]byte(key)) if block == nil { return false, errors.New("uh oh") } sh := crypto.SHA256.New() sh.Write([]byte(message)) hashed := sh.Sum(nil) pub, err := x509.ParsePKIXPublicKey(block.Bytes) if err != nil { return false, err } if pubKey, ok := pub.(*rsa.PublicKey); ok { err := rsa.VerifyPKCS1v15(pubKey, crypto.SHA256, hashed, []byte(signature)) if err != nil { // THIS IS WHERE I END UP EVERY TIME return false, err } return true, nil }}
無法驗證 GO 中的 SHA256 簽名
慕工程0101907
2022-09-12 16:17:24