首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在go中验证SHA256签名

无法在go中验证SHA256签名
EN

Stack Overflow用户
提问于 2021-06-28 23:19:47
回答 1查看 333关注 0票数 1

我一直试图用go密码包验证Node中生成的签名。签名是从createSig()函数生成的。在go中,我正在用verifySig()验证这一点,但它总是失败的。这些私钥/公钥可以安全地共享,因为它们是为本例生成的。我能够从签名中运行Node的验证,没有问题,但我不确定在go中发生了什么,使它失败。

在节点中生成签名

代码语言:javascript
复制
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

代码语言:javascript
复制
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
    }
}

工作节点核查:

代码语言:javascript
复制
function verifySig(message, signature) {

  const PUBLIC_KEY =
  "-----BEGIN PUBLIC KEY-----\nMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMl9Y7kNgFYUuTXSpSS+YOAPnzy1FFod\nk6tfn9Gda29XaQmfkVxAiQHVuKHLJeZ9uELZsw+umf7NW7PgeTsg+CsCAwEAAQ==\n-----END PUBLIC KEY-----";

  var verifier = crypto.createVerify("RSA-SHA256");
  verifier.update(message);

  // will return true
  return verifier.verify(PUBLIC_KEY, signature, "base64");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-29 10:44:00

我认为你的代码有两个问题。

First:在NodeJs中,您使用Base64和secondly对签名进行编码,您将Base64字符串转换为"UrlSafe“Base64 64编码字符串。

这两个步骤需要反转(我不知道Go是否有内置的“Url安全Base64解码功能”),然后使用签名字符串作为Go中验证的输入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68170946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档