Gpg

如何找出 gpg-agent 記憶體了哪些鍵?(比如 ssh-add -l 如何顯示記憶體的 ssh 密鑰)

  • August 11, 2021

ssh-add -l向您顯示所有已添加的 ssh 密鑰ssh-add ~/.ssh/id_yourkey。我如何使用 gpg 和 gpg-agent 做類似的事情,換句話說,要求它顯示記憶體鍵的列表?

您可能無法做到這一點,至少現在還沒有,或者至少在一般情況下無法做到。但是,我會分享我學到的東西,並期待在適當的時候更新這個答案。

首先,與ssh-agent實際記憶體私鑰的功能不同,它gpg-agent可以記憶體密鑰或密碼。記憶體哪個客戶端取決於每個客戶端,並且gpg僅用於gpg-agent記憶體密碼。

gpg-agent您可以使用該gpg-connect-agent實用程序進行互動。在下面的範例中,我通過 STDIN 一次傳遞一個命令。

$ CACHEID="ThisIsTheTrickyPart"
$ ERRSTR="Error+string+goes+here"
$ PMTSTR="Prompt"
$ DESSTR="Description+string+goes+here"
$ echo "GET_PASSPHRASE --data $CACHEID $ERRSTR $PMTSTR $DESSTR" | gpg-connect-agent
D MyPassPhrase
OK

呼叫gpg-connect-agent並傳入此命令後,pinentry在我的系統上配置的命令使用錯誤、提示和描述字元串來提示輸入密碼。在這種情況下,我輸入了“MyPassPhrase”,這是結構化輸出中返回的內容*(見下圖)*。如果我GET_PASSPHRASE再次gpg-agent使用相同$CACHEIDpinentry.

                                 對話框的ss

GET_PASSPHRASE還接受一個--no-ask選項,該選項將在記憶體未命中時返回錯誤。gpg-agent在這裡,我使用“NotCachedID”作為記憶體 ID,並使用虛擬字元串作為不會使用的所需參數。

$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>

那麼,原則上,您可以依次向代理詢問每個可能記憶體的密碼片語,並在輸出中檢查OKERR。那麼問題就變成了,如何生成記憶體 ID?正如我們在上面的範例中看到的,gpg-agent它接受的記憶體 ID 是自由的。事實證明,gpg計算公鑰上的指紋並使用十六進制編碼的字元串表示作為記憶體 ID,但問題是該指紋與您可以通過以下方式學習的指紋不同gpg --fingerprint --list-secret-keys. 該摘要稱為 keygrip(因為它僅在原始密鑰材料上計算,而指紋是在密鑰材料和創建時間戳上計算)。如果您真的想沿著這條路繼續下去,您將必須了解如何為您希望檢查的每個鍵生成正確的指紋(使用下一代 GnuPG 2.1 和選項將很容易--with-keygrip)。

**警告:**的輸出GET_PASSPHRASE實際上包含clear 中的密碼。即使您不選擇該--data選項,密碼片語也可以清楚地看到為十六進制編碼的字元串。除非您知道自己在做什麼,並採取適當的預防措施,否則這可能是一個非常糟糕的主意(tm)。

引用自:https://unix.stackexchange.com/questions/71135