如何判断使用gpg --gen-key创建的GPG key是否带有passphrase
如何判断本地GPG密钥是否设置了passphrase
你之前对比两个创建时分别输入/不输入passphrase的密钥找不到差异是完全正常的:passphrase仅用于加密本地存储的私钥实体本身,和公钥的所有公开元数据没有关联。无论是否设置passphrase,密钥的指纹、长度、创建时间、绑定的身份信息这些公钥层面的内容完全一致,只对比公钥维度的信息根本不可能区分两类密钥。
你可以通过以下两个可落地的方法完成判断:
- 静态校验:通过GPG交互界面查看私钥加密状态标记
- 执行命令进入目标密钥的编辑模式:
gpg --edit-key <密钥ID/绑定的身份邮箱> - 在弹出的
gpg>交互提示符下输入list回车,展示密钥的完整条目 - 核对私钥行的类型标记:
- 若私钥类型标识(sec=主私钥、ssb=子私钥)后方无#号后缀,代表该私钥是明文落地存储的,也就是创建时未设置passphrase,调用时无需密码
- 若私钥类型标识后方紧跟着#号(比如显示为
sec#、ssb#),代表该私钥是经过passphrase加密存储的,调用时必须验证密码才能使用
- 执行命令进入目标密钥的编辑模式:
- 动态校验:通过实际私钥操作做终验(准确率100%)
受GPG版本、配置差异影响,静态标记偶尔会出现显示不全的问题,直接触发私钥调用的判断方式没有任何误差:- 新建一个临时测试文件:
echo "test" > gpg_test.txt - 执行签名命令直接关联目标私钥:
gpg --sign --local-user <你的目标密钥ID> gpg_test.txt - 如果命令全程没有弹出passphrase输入提示,直接生成了签名文件
gpg_test.txt.gpg,就证明对应密钥没有设置passphrase;如果弹出密码校验框,就代表密钥已设置passphrase。
- 新建一个临时测试文件:
注意:普通的
gpg --list-keys、公钥服务器展示的所有信息都不会携带私钥的加密状态,通过这类输出判断密钥是否设置过passphrase是完全无效的。
内容的提问来源于stack exchange,提问作者Ashim Bhargav
相关产品推荐
相关产品推荐

