我有一个使用gpg密钥的应用程序,并提示输入密码来读取它。这就是我这样做的方式(基于我在别处找到的一个例子:
func Decrypt(publicKeyring string, secretKeyring string, key string, password string) (string, error) {
var entity *openpgp.Entity
var entityList openpgp.EntityList
keyringFileBuffer, err := os.Open(secretKeyring)
if err != nil {
return "", err
}
defer keyringFileBuffer.Close()
entityList, err = openpgp.ReadKeyRing(keyringFileBuffer)
if err != nil {
return "", err
}
entity = entityList[0]
passphraseByte := []byte(password)
entity.PrivateKey.Decrypt(passphraseByte)
for _, subkey := range entity.Subkeys {
subkey.PrivateKey.Decrypt(passphraseByte)
}
dec, err := base64.StdEncoding.DecodeString(key)
if err != nil {
return "", err
}
// Decrypt it with the contents of the private key
md, err := openpgp.ReadMessage(bytes.NewBuffer(dec), entityList, nil, nil)
if err != nil {
return "", err
}
bytes, err := ioutil.ReadAll(md.UnverifiedBody)
if err != nil {
return "", err
}
decStr := string(bytes)
return decStr, nil
}
这里假设用户有一个传递的KeyRin,默认值是secring,如下所示:
viper.SetDefault("gpgsecretkeyring", home+"/.gnupg/secring.gpg")
然而,
我收到的报告显示,某些Mac用户正在努力让应用程序正常运行,原因是他们不知道如何定义分组。
似乎较新版本的GnuPG已经弃用了该版本。
https://www.gnupg.org/faq/whats-new-in-2.1.html#nosecring
此时我不知道如何使用golang.org/x/crypto/openpgp
读取密钥。有没有最佳方法的例子?
答案 0 :(得分:0)
我厌倦了解决这个问题,因此我决定从gpg -dq
向os.Exec
发送package gpg
import (
"bytes"
"encoding/base64"
"os/exec"
)
func Decrypt(key string) (string, error) {
var cmd exec.Cmd
var output bytes.Buffer
gpgCmd, err := exec.LookPath("gpg")
if err != nil {
return "", err
}
cmd.Path = gpgCmd
cmd.Args = []string{"--decrypt", "--quiet"}
dec, err := base64.StdEncoding.DecodeString(key)
if err != nil {
return "", err
}
// return the reader interface for dec (byte array)
d := bytes.NewReader(dec)
// pipe d to gpg commands stdin
cmd.Stdin = d
cmd.Stdout = &output
if err := cmd.Run(); err != nil {
return "", err
}
// return the output from the gpg command
return output.String(), nil
}
更容易。样品:
{{1}}
答案 1 :(得分:0)
GnuPG 2.1引入了两个变化:
secring.gpg
合并到pubring.gpg
文件中,您应该能够从pubring.gpg
文件中读取密钥。如果您想使用GnuPG的密钥环,请直接拨打GnuPG。如果你想使用Go的库,请不要弄乱GnuPG的密钥环文件并存储你自己的密钥副本。