私钥在 Yubikey 上后,它们不可导出。您可以导出的是密钥存根,实际上只是说这个密钥在智能卡上。它们是使密钥在另一台计算机(使用智能卡)上工作的主要方法,但如今,由于存储了足够的有关密钥的信息,您只需要使用 --card-status 来获取相同的存根从硬件密钥,并导入公钥。
您可以尝试查看导出的存根中包含哪些信息
% gpg --list-packets --verbose <exported-stub.bin
# off=1796 ctb=9d tag=7 hlen=3 plen=294
:secret sub key packet:
version 4, algo 1, created NNNNNNNNN, expires 0
pkey[0]: [2048 bits]
pkey[1]: [17 bits]
gnu-divert-to-card S2K, algo: 0, simple checksum, hash: 0
serial-number: <ELIDED>
keyid: <KEYID>
# off=2093 ctb=89 tag=2 hlen=3 plen=293
:signature packet: algo 1, keyid <KEYID>
version 4, created NNNNNNNNNN, md5len 0, sigclass 0x18
digest algo 8, begin of digest 7c 79
hashed subpkt 2 len 4 (sig created <YYYY-MM-DD>)
hashed subpkt 27 len 1 (key flags: 20)
hashed subpkt 9 len 4 (key expires after <TIME>)
subpkt 16 len 8 (issuer key ID <KEYID>)
data: [2048 bits]
虽然看起来“密钥子数据包”确实有一个pkey,但 gnu-diver-to-card 条目表示不存在密钥。签名是密钥的签名,是为了保证可以用公钥验证,不包含私钥。
另一个暗示一切都是安全的,在这种情况下 gpg 不会要求输入密码来导出密钥。
更新:通过来源确认pkey确实指的是公钥,而不是私钥 - 在 gnupg 中称为skey。包含密码保护密钥的数据包如下所示:
off=557 ctb=9c tag=7 hlen=2 plen=134
:secret sub key packet:
version 4, algo 22, created NNNNNNNNNN, expires 0
pkey[0]: [80 bits] ed25519 (1.3.6.1.4.1.11591.15.1)
pkey[1]: [263 bits]
iter+salt S2K, algo: 7, SHA1 protection, hash: 2, salt: HHHHHHHHHHHHHHHH
protect count: NNNNNNN (NNN)
protect IV: <IV>
>> skey[2]: [v4 protected] <<
keyid: <KEYID>
所以总而言之,私钥是安全的,当使用 Yubikey 等智能卡时,加密内容不会以上述方式导出。