gpt4 book ai didi

go - 如何验证公钥上的 OpenPGP 签名?

转载 作者:数据小太阳 更新时间:2023-10-29 03:16:01 28 4
gpt4 key购买 nike

我正在开发一个需要验证 OpenPGP 公钥的 go 项目,以便能够使用它来验证文件签名。

我生成了一个根 key 和另一个 key ,我用根 key 对其进行了签名(我们称第二个 key 为已签名)。我已将签名 key 的公共(public)部分导出到装甲文本文件中,以便于分发:

gpg --export -a signed > signed.asc

我写了这段 go 代码,它最终说明了我想做什么:

package main

import (
"flag"
"fmt"
"golang.org/x/crypto/openpgp"
"os"
)

func main() {
var keyringpath string
var signedkeypath string
flag.StringVar(&keyringpath, "keyring", "", "keyring")
flag.StringVar(&signedkeypath, "signedkey", "", "signed key")
flag.Parse()

// read the keyring
keyring, err := os.Open(keyringpath)
if err != nil {
panic(err)
}

el, err := openpgp.ReadKeyRing(keyring)
if err != nil {
panic(err)
}

var rootidentity *openpgp.Entity
for _, entity := range el {
if _, ok := entity.Identities["root"]; ok {
rootidentity = entity
}
}

fmt.Printf("%+v\n", rootidentity)

// read the public armored key
signedkey, err := os.Open(signedkeypath)
if err != nil {
panic(err)
}

el, err = openpgp.ReadArmoredKeyRing(signedkey)
if err != nil {
panic(err)
}

signed := el[0]

fmt.Printf("%+v\n", signed)

// there is only one signature on signed, the one produced by root
signature := signed.Identities["signed"].Signatures[0]

err = rootidentity.PrimaryKey.VerifyKeySignature(signed.PrimaryKey, signature)
if err != nil {
panic(err)
}
}

当我运行它时,我给 keyring 我的公钥环 (~/.gnupg/pubring.gpg) 和 signedkey 我导出的签名 key (signed.asc)。

在生产中,想法是将根公钥从 pubring.gpg 导出到装甲文本中,并将其嵌入到代码中。

签名验证失败,出现以下错误:

panic: openpgp: invalid signature: hash tag doesn't match

查看 VerifyKeySignature 的代码(尤其是 this comment ),我觉得它只用于验证子 key 的签名,而不是其他 key 。

所以,问题是,给定两个 PGP 公钥,一个由另一个签名,我如何使用 openpgp 库验证该签名?

最佳答案

不确定我是否应该关闭这个问题:我找到了答案。文档中不是很清楚,但是 VerifyKeySignature 确实可能只用于子 key 。要验证其他用户公钥上的签名,请使用 VerifyUserIdSignature,如下所示:

err = rootidentity.PrimaryKey.VerifyUserIdSignature("signed", signed.PrimaryKey, signature)
if err != nil {
panic(err)
}

关于go - 如何验证公钥上的 OpenPGP 签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35503435/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com