2017-08-28 101 views
1

我有一個使用gpg密鑰並提示輸入密碼的應用程序。這是我做的方式,(基於一個例子,我在別處找到了:Golang pgp without secring

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上一些用戶都在努力獲取應用程序的工作,原因是他們不知道如何定義secring。

似乎GnuPG的較新版本已被棄用臨時版。

https://www.gnupg.org/faq/whats-new-in-2.1.html#nosecring

我不知道如何閱讀在這一點上使用golang.org/x/crypto/openpgp密鑰。有沒有這樣做的最好方法的例子?

回答

0

我厭倦了這個,所以我決定從os.Exec掏出gpg -dq更容易。示例:

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 

} 
0

的GnuPG 2.1引入了兩個變化:

  • 合併secring.gpgpubring.gpg文件,你應該能夠從pubring.gpg文件中讀取密鑰。
  • 對於新的安裝,使用新的密鑰箱格式,這是go庫不支持的(截至今日,至少)。舊的安裝(因此,以舊格式的密鑰環)不會自動合併。

如果你想使用GnuPG的鑰匙環,直接調用GnuPG。如果你想使用Go的庫,請不要混淆GnuPG的鑰匙環文件並存儲你自己的密鑰副本。