插入 Yubikey 后 export-secret-key

信息安全 gnupg 智能卡 优比键
2021-09-02 16:04:30

我有一个 Yubikey Neo 并且正在 OS X (10.11.2) 上运行 GPGTools (GnuPG/MacGPG2 2.0.28)。keytocard我已经生成了一个具有 SC 能力的主密钥以及单独的签名和加密密钥,我已通过命令将其移动到 Yubikey 。这些是在单独的离线计算机上完成的。

在我的日常计算机上,我只导入了我的公钥。当我插入 Yubikey 并运行gpg --card-status时,正如预期的那样,它显示了两个秘密子密钥。但是,一旦 Yubikey 被移除,我就可以运行gpg --list-secret-keys,它会显示我的签名和加密秘密子密钥。此外,我可以gpg --export-secret-key并且还重新导入它们,尽管这些密钥无法执行任何签名或解密任何文件(同样,从计算机中删除了 Yubikey)。这是非常奇怪的行为,因为计算机似乎正在从 Yubikey 读取私钥并将其存储在本地(即使这些私钥无效)。

重现步骤:

  1. 从空的 GPG 钥匙串开始,通过gpg --list-keys.
  2. 插入带有子密钥的 Yubikey,通过 . 验证这些子密钥gpg --card-status
  3. 移除 Yubikey。
  4. 运行gpg --list-secret-key,来自 Yubikey 的子键将出现。
  5. 你也可以运行gpg --armor --export-secret-key <key>,会打印一个私钥(这个私钥似乎不能执行任何操作)。

我是否误解了任何信息?

1个回答

私钥在 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 等智能卡时,加密内容不会以上述方式导出。