【问题标题】:EOF error while reading PGP keys from JSON Golang从 JSON Golang 读取 PGP 密钥时出现 EOF 错误
【发布时间】:2019-03-20 05:13:04
【问题描述】:

我正在使用 Golang 开发一个 API,我有一个 JSON 文件 keys.json 如下:

{
  "publicKeys": {
    "Flex": "<valid pgp public key>",
    "Flex2": "<valid pgp public key>"
  },
  "privateKey": "<valid pgp private key>"
}

为了解组这个,我有以下模型

type PGPKeys struct {
    PublicKeys map[string]string `json:"publicKeys"`
    PrivateKey string            `json:"privateKey"`
}

我使用

解组代码
keysJSONFile, err := os.Open(keysPath)
    if keysJSONFile != nil {
        defer keysJSONFile.Close()
    }
    if err != nil {
        return nil, err
    }

    keysJSONBytes, err := ioutil.ReadAll(keysJSONFile)
    if err != nil {
        return nil, err
    }

    var pgpKeys PGPKeys
    err = json.Unmarshal(keysJSONBytes, &pgpKeys)
    if err != nil {
        return nil, err
    }

稍后,当我使用openpgp 获取公钥数据包时,遇到EOF 错误,armor.Decode 在找不到任何块时返回该错误-但我不确定为什么会这样

func GetPublicKeyPacket(publicKey []byte) (*packet.PublicKey, error) {
    publicKeyReader := bytes.NewReader(publicKey)
    block, err := armor.Decode(publicKeyReader)
    if err != nil {
        return nil, err
    }

    if block.Type != openpgp.PublicKeyType {
        return nil, errors.New("Invalid public key data")
    }

    packetReader := packet.NewReader(block.Body)
    pkt, err := packetReader.Next()
    if err != nil {
        return nil, err
    }

    key, ok := pkt.(*packet.PublicKey)
    if !ok {
        return nil, err
    }
    return key, nil
}

注意:当我调用函数时,我会使用类似的东西进行类型转换

publicKeyPacket, err := pgp.GetPublicKeyPacket([]byte(h.PGPKeys.PublicKeys[h.Config.PGPIdentifier]))

最后,我尝试将密钥移动到单独的 TXT 文件中,并且可行,但由于某种原因,将它们放在 JSON 中不起作用

【问题讨论】:

    标签: json go openpgp


    【解决方案1】:

    我在随机尝试一些东西时找到了解决方案,我和你(未来的答案读者)一样感到惊讶。如果有人能提供解释,我将不胜感激。

    我通过将所有换行符替换为“\n”来将密钥存储在 JSON 中,以便将其存储在一行中。你知道 PGP 密钥是如何在-----BEGIN PGP PUBLIC KEY BLOCK----- 之后有一个空行的吗?好吧,在我的文件中,我有类似

    "publicKeys": {
        "Flex": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nQfdsf...."
    }
    

    添加额外的空行,即将其更改为

    "publicKeys": {
        "Flex": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nQfdsf...."
    }
    

    编辑:正如@Adrian 在 cmets 中提到的,这是因为根据 RFC 规范,如果该行不再存在,则它是一个无效的 PGP 密钥。应该是这样的。

    【讨论】:

    • “不知何故”是:使您提供的值符合键的预期格式。
    • 但是我做类型转换。此外,当它从 json 读取时,它仍然读取为文本。
    • 我并不是说它不是正确的变量类型或者它不是文本。键的预期格式包括标题后的两个换行符,你有一个。您的回答说更改“以某种方式修复了它”,就好像它是一个谜一样,但实际上您刚刚更正了输入数据以匹配该数据的指定格式。您可以在RFC4880, Section 7 中找到有关预期数据格式的更多信息。
    • 我明白了,非常感谢您解决这个问题。我从来没有想过没有多余的行会使整个密钥无效。
    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2021-12-14
    • 2020-08-21
    • 2020-12-13
    相关资源
    最近更新 更多