猿问

无法验证 GO 中的 SHA256 签名

我一直在尝试使用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

    }

}


慕工程0101907
浏览 229回答 1
1回答

PIPIONE

我认为你的代码有2个问题。首先:在 NodeJ 中,您使用 Base64 对签名进行了编码,其次,您将 Base64 字符串转换为“UrlSafe”Base64 编码的字符串。在使用签名字符串作为Go中验证的输入之前,需要反转这两个步骤(我不知道Go是否具有内置的“Url-safe Base64解码函数”)。
随时随地看视频慕课网APP

相关分类

Go
我要回答