web-dev-qa-db-ja.com

GnuPG秘密鍵にスクリプトからパスフレーズがあるかどうかを検出するにはどうすればよいですか?

開発者がパペットツリー(Gitにコミットされていない)内にパスフレーズなしで秘密鍵のコピーを保存できるようにスクリプトを作成しました。これにより、Vagrantボックスがeyaml + gpg( https:// github.com/sihil/hiera-eyaml-gpg )テスト中に秘密データにアクセスします。

スクリプトはうまく機能しますが、コピーで秘密鍵のパスフレーズが適切に削除されていることを確認するプロセスも自動化したいと思います。

これまでのところ、私が見つけた唯一の方法は手動です-gpg --homedir ... --edit-key keyidを実行してから、インタラクティブプロンプトでpasswordを実行し、This key is not protected.メッセージを探します。

これをスクリプトで自動的に実行したいと思います。基本的に、gpgツールがこのメッセージを出力する必要があることをどのようにして知るのか知りたいです。 https://security.stackexchange.com/a/54205/45966 の回答と g10/export.c のGnuPGソースコードを読むと、「いいえ」と結論します「パスフレーズ」は実際には「パスフレーズは空の文字列」と見なされ、コードは実際にパスフレーズを使用してランダムな文字列を復号化し、結果に繰り返しランダムパターンが含まれていることを確認します。

これは正しいです?

もしそうなら-そのプロセス全体を自分で再実装する必要を回避する方法はありますが、代わりにgpgコマンドラインツールまたはいくつかのPython/Ruby APIを使用してそれを行いますか?私はいくつかのPythonとRuby gpgmeのフロントエンドを調べましたが、このようなものはそこにありませんでした。

g10/build-packet.c を見ると、パケットが保護されているかどうかにかかわらず、別の出力が予想されますが、保護されている秘密鍵と保護されていない秘密鍵のダンプを比較しようとしても、何も出力されませんでしたハッシュの小さな違い。そこでコードを誤解している可能性があります。

2
Amos Shapira

私のテストでは、gpg --list-packetsは、キーが暗号化されているかどうかに応じて異なる結果をもたらします。パスフレーズなしで生成されたキーは、キーに関する情報を直接公開します:

:secret key packet:
    version 4, algo 1, created 1444376378, expires 0
    skey[0]: [1024 bits]
    skey[1]: [17 bits]
    skey[2]: [1017 bits]
    skey[3]: [512 bits]
    skey[4]: [512 bits]
    skey[5]: [510 bits]
    checksum: 9df4
    keyid: [snip]

パスフレーズ付きの鍵は、公開鍵の部分と使用中の文字列から鍵への手続きに関する情報のみを提供します。

:secret key packet:
        version 4, algo 1, created 1378729401, expires 0
        skey[0]: [1024 bits]
        skey[1]: [17 bits]
        iter+salt S2K, algo: 3, SHA1 protection, hash: 10, salt: e182c39f07747f0c
        protect count: 65011712 (255)
        protect IV:  d5 0d 20 dc cb a2 e9 16
        encrypted stuff follows
        keyid: 99543578D453449B

それでも出力を解析する必要がありますが、これは[whatever] S2K行がないことを直接確認できるほど十分に安定しているはずです(S2Kプロシージャが異なるため、すべてフェッチするか、何らかのワイルドカードを使用してください。 )。残念ながら、--with-colons--list-packetsの特別な出力はありませんが、解析がより簡単で信頼性が高くなります。

2
Jens Erat