Golang使用rsa对结构进行签名 [英] Golang signing a struct using rsa

查看:24
本文介绍了Golang使用rsa对结构进行签名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个具有以下字段的结构Transaction

type Transaction struct {
    Sender    string `json:"sender"`
    Receiver  string `json:"receiver"`
    Signature string `json:"signature"`
    Amount    int64  `json:"amount"`
}

我还有一个函数GetPrivateKey(),它返回一个*rsa.PrivateKey

func GetPrivateKey() (*rsa.PrivateKey, error) {
    key, err := ioutil.ReadFile("/Users/xxx/.ssh/id_rsa")
    if err != nil {
        return nil, err
    }

    block, _ := pem.Decode(key)
    der, err := x509.ParsePKCS1PrivateKey(block.Bytes)
    if err != nil {
       return nil, err
    }
    return der, err
 }

我这里的计划是使用系统中已有的私钥对structtransaction的内容进行签名,然后将其作为字符串存储在struct的字段signature中,为此,我有一个函数SignPayload()

func SignPayload(txnObj *Transaction) error {
    privateKey, err := GetPrivateKey()
    if err != nil {
        panic(err)
    }
    bodyHash, err := rsa.SignPKCS1v15(rand.Reader, privateKey, 
                     crypto.SHA256, []byte(fmt.Sprintf("%v", *txnObj)))
    if err != nil {
        panic(err)
    }
    txnObj.Signature = string(bodyHash)
    log.Println(txnObj.Signature)
    return err
}

遗憾的是,这不起作用,rsa.SignPKCS1v15()抛出错误消息:

crypto/rsa:输入必须是哈希消息

这里的最终目标是使用此签名通过将其与字段sender中存在的公钥进行比较来验证结构的真实性。 我在密码学方面绝对是新手,我在这方面做错了什么?更重要的是,我如何才能做到这一点?

提前感谢!

推荐答案

这里有两件事:

  • 只有小消息才能签名,这就是它通常是散列的原因。rsa.SignPKCS1v15需要与哈希算法的输出匹配的消息长度(256位,或对于SHA-256为32字节)
  • 不要使用结构的%v表示形式,而应将其序列化

第一个是spelled out in the rsa docs。给定一条消息,您可以使用以下内容对其签名:

message := []byte("message to be signed")
hashed := sha256.Sum256(message)

signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed[:])
if err != nil {
    panic(err)}
}

第二点更多的是关于使您的代码更健壮。您不希望更改%v逻辑或添加非导出字段而导致问题。您可能还希望使用Go以外的语言检查签名。

因此,您应该首先封送您的结构。您已经在其上添加了json标记,因此非常简单:

message, err := json.Marshal(txnObj)
if err != nil {
    panic(err)
}

消息是传递到上面的sha256.Sum256的字节切片。

验证签名时,需要确保将结构的Signature字段清零、封送、散列并调用rsa.VerifyPKCS1v15

这篇关于Golang使用rsa对结构进行签名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆