GnuPG:密鑰 ID 和指紋的表示
在
gpg
的手冊頁中,有鍵 ID 的範例:234567C4 0F34E556E 01347A56A 0xAB123456 234AABBCC34567C4 0F323456784E56EAB 01AB3FED1347A5612 0x234AABBCC34567C4
和指紋:
1234343434343434C434343434343434 123434343434343C3434343434343734349A3434 0E12343434343434343434EAB3484343434343434 0xE12343434343434343434EAB3484343434343434
我的直覺是,前導 0 表示八進制,前導 0x 表示十六進制,但似乎並非如此。
有哪些不同的表示?
***注意:*在我開始之前,這裡的所有表示都是十六進制的。沒有其他代表。
密鑰 ID
手冊頁似乎很清楚這些值的來源。密鑰 ID 是 SHA-1 指紋的一部分。
X.509 證書的密鑰 ID 是其 SHA-1 指紋的低 64 位。使用密鑰 ID 只是一種快捷方式,對於所有自動處理都應該使用指紋。
所有這些值都是十六進制的,該表示法允許數字以
0x
、 a為前綴0
,或者簡單地以非零值開頭。**注意:**使用密鑰 ID 本質上是一個壞主意,因為它們本質上是利用指紋的一部分來辨識給定的密鑰。問題在於在密鑰 ID 之間產生衝突有點微不足道。有關此問題的更多資訊,請參閱這篇文章,標題為:短密鑰 ID 是壞消息(使用 OpenPGP 和 GNU Privacy Guard)。
摘抄
**總結:**我們(通過 GNU Privacy Guard 依賴 OpenPGP 的 Debian 社區)停止使用短密鑰 ID 很重要。OpenPGP 和 GPG 中沒有漏洞。但是,使用短密鑰 ID(如 0x70096AD1)從根本上講是不安全的;短密鑰 ID 很容易產生衝突。我們應該始終使用 64 位(或更長)的密鑰 ID,例如:0x37E1C17570096AD1 或 0xEC4B033C70096AD1。
**TL;DR:**這現在給出了兩個結果:
gpg --recv-key 70096AD1
指紋
而指紋:
這種格式是從字元串的長度及其內容或 0x 前綴推導出來的。請注意,只有 20 字節版本的指紋可用於 gpgsm(即證書的 SHA-1 雜湊)。
使用 gpg 時,可能會附加驚嘆號 (!) 以強制使用指定的主鍵或輔助鍵,而不是嘗試計算要使用的主鍵或輔助鍵。
指定密鑰 ID 的最佳方法是使用指紋。這避免了在存在重複密鑰 ID 的情況下的任何歧義。
我建議查看標題為:公鑰指紋的維基百科頁面。它詳細說明瞭如何生成指紋。這是摘要:
摘抄
- 公鑰(以及可選的一些附加數據)被編碼為字節序列。為確保以後可以重新創建相同的指紋,編碼必須是確定性的,並且任何附加數據都必須與公鑰一起交換和儲存。附加數據通常是任何使用公鑰的人都應該知道的資訊。附加數據的範例包括:密鑰應與哪些協議版本一起使用(在 PGP 指紋的情況下);和密鑰持有者的名稱(在 X.509 信任錨指紋的情況下,附加數據由 X.509 自簽名證書組成)。
- 上一步生成的數據使用加密散列函式(例如 MD5 或 SHA-1)進行散列。
- 如果需要,可以截斷散列函式輸出以提供更短、更方便的指紋。
此過程產生一個短指紋,可用於驗證更大的公鑰。例如,典型的 RSA 公鑰長度為 1024 位或更長,而典型的 MD5 或 SHA-1 指紋長度僅為 128 或 160 位。
當顯示以供人工檢查時,指紋通常被編碼為十六進製字元串。然後將這些字元串格式化為字元組以提高可讀性。例如,SSH 的 128 位 MD5 指紋將顯示如下:
43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8
參考