如何找出 gpg-agent 記憶體了哪些鍵?(比如 ssh-add -l 如何顯示記憶體的 ssh 密鑰)
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
使用相同$CACHEID
的pinentry
.
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>
那麼,原則上,您可以依次向代理詢問每個可能記憶體的密碼片語,並在輸出中檢查
OK
或ERR
。那麼問題就變成了,如何生成記憶體 ID?正如我們在上面的範例中看到的,gpg-agent
它接受的記憶體 ID 是自由的。事實證明,gpg
計算公鑰上的指紋並使用十六進制編碼的字元串表示作為記憶體 ID,但問題是該指紋與您可以通過以下方式學習的指紋不同gpg --fingerprint --list-secret-keys
. 該摘要稱為 keygrip(因為它僅在原始密鑰材料上計算,而指紋是在密鑰材料和創建時間戳上計算)。如果您真的想沿著這條路繼續下去,您將必須了解如何為您希望檢查的每個鍵生成正確的指紋(使用下一代 GnuPG 2.1 和選項將很容易--with-keygrip
)。**警告:**的輸出
GET_PASSPHRASE
實際上包含clear 中的密碼。即使您不選擇該--data
選項,密碼片語也可以清楚地看到為十六進制編碼的字元串。除非您知道自己在做什麼,並採取適當的預防措施,否則這可能是一個非常糟糕的主意(tm)。