繁體中文

開發者工具 · SHA 雜湊計算器

憑證與 SSH 指紋:SHA-256 如何辨識公鑰

· 背景

sha-256 密碼學 安全

SSH 主機金鑰提示顯示 SHA256:帶有 Base64 摘要的指紋
原始 ToolAcre 向量圖

指紋是憑證或金鑰的雜湊值,夠短以便可以大聲朗讀。這篇文章解釋了 TLS 和 SSH 指紋的計算方式、為什麼 SHA-1 指紋被替換,以及匹配證明了什麼。

您始終接受的主機金鑰提示 — SHA256: 行要求您進行比較

當您第一次透過 SSH 連線到伺服器時,您會看到一條提示,詢問是否接受主機金鑰。提示顯示指紋:`SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8` 或類似的。該指紋是伺服器公鑰的雜湊值。系統會要求您在帶外(SSH 協定之外)驗證您是否識別此金鑰。此提示通常也會顯示金鑰類型(RSA、ED25519、ECDSA)和指紋格式。如果您之前透過可信任頻道看到過該金鑰的指紋,則可以放心地鍵入「yes」。如果不是,接受意味著相信網路會傳遞正確的密鑰。

指紋只是應用於編碼金鑰的加密雜湊函數的輸出。對於 SSH,金鑰被編碼為二進位 blob(OpenSSH 有線格式),並根據該 blob 計算雜湊值。指紋比全鍵短,因此可讀且可輸入。相同的指紋始終來自相同的金鑰,因此您可以比較在多個位置或頻道發布的指紋。

指紋等於編碼的雜湊值 — DER 憑證或公鑰 blob 作為輸入

SSH 主機金鑰和 TLS 憑證的編碼方式不同,但指紋辨識原理相同。對於 SSH,指紋是根據公鑰材料計算的。對於 TLS 證書,指紋是根據整個證書(包括頒發者、有效期限和其他欄位)計算得出的。當您連線到 Web 伺服器時,瀏覽器不會向您顯示憑證指紋,因為 TLS 使用不同的信任模型:瀏覽器信任一組預先安裝的憑證授權單位 (CA),而這些 CA 會為憑證提供擔保。 SSH 不使用預先安裝的 CA;相反,您信任特定金鑰並將它們本機儲存在 `~/.ssh/known_hosts` 中。

由於指紋包含 TLS 的整個憑證位元組,因此變更有效日期而不重新簽署會導致不同的指紋。對SSH來說,指紋只是公鑰的指紋,所以只要金鑰不改變,指紋就是穩定的。

此計算器示範 SHA-1 和 SHA-256 長度;指紋策略建議需要協定來源

歷史上,SSH 指紋以 MD5 十六進位顯示。 MD5 的密碼學已被破解,且碰撞是可行的。安全社群已將 SHA-256 指紋作為預設設定。您可能仍會看到 SSH 用戶端顯示的兩種格式:`SHA256: base64` 和 `MD5: hex`。 SHA-256 指紋是值得信賴的身份驗證指紋。如果您看到兩者,請將 SHA-256 版本與來自受信任來源(伺服器的網站、管理員簽署的電子郵件、內部 wiki)的指紋進行比較。 MD5 指紋較不可靠,因為有 MD5 衝突。

指紋格式的變化是密碼轉換的明顯標誌。較舊的 OpenSSH 版本僅顯示 MD5。現代版本預設顯示 SHA-256 。指令 `ssh-keygen -l -f /path/to/key` 以您的 ssh-keygen 版本的預設格式顯示金鑰的指紋;您可以使用 `-E` 標誌強制使用特定格式(例如 `-E sha256` 或 `-E md5`)。

SSH 的 base64 SHA256:格式 — 使指紋比十六進位短的編碼更改

SSH base64 指紋使用變體格式:它們以演演算法名稱和冒號為前綴,例如 `SHA256:base64string`。這與子資源完整性 (SRI) 格式不同,後者使用連字號並僅包含標準的 base64。 SSH 格式包含一個標籤,可以明確指出是哪個演演算法產生摘要。當您在 SSH 輸出中看到指紋時,總是會顯示演演算法。當您看到 SRI 完整性屬性時,演演算法會被編碼為帶有連字符的前綴。

ToolAcre SHA 雜湊計算器的 base64 輸出是標準形式;若要符合 SSH 指紋,請新增 `SHA256: `(演演算法名稱、冒號和空格)。計算器中的十六進位形式不是 SSH 顯示的形式,儘管它代表相同的摘要並對於驗證目的同樣有效。

匹配證明了什麼 - 您持有另一方發布的相同密鑰字節,並在沒有帶外檢查的情況下沒有關於密鑰所有者的任何信息

指紋匹配證明了兩件事:首先,您持有另一方發布的相同密鑰字節,其次,自計算摘要以來,密鑰和指紋都沒有被更改。它不證明密鑰所有者的身份或授權任何特定操作。帶外驗證指紋是信任金鑰的必要條件,但不是充分條件。您還必須驗證發布指紋的人是否是他們聲稱的人。

實際上,如果管理員在公司 Intranet 或簽署電子郵件中發布伺服器的 SSH 指紋,您可以驗證它是否與連接時收到的提示相符。如果指紋不匹配,您可以放心地拒絕連接,因為有人正在攔截您的流量或伺服器金鑰已更改。如果指紋匹配,您就知道您擁有正確的鑰匙。該金鑰是否屬於正確的伺服器是一個單獨的問題,您可以透過驗證發布管道來回答這個問題(Intranet 頁面看起來合法嗎?電子郵件實際上來自該管理員帳戶嗎?)。

工作範例 — 逐步驗證透過可信管道發布的指紋

憑證指紋有相同的目的:它唯一地識別特定的憑證。如果 TLS 伺服器變更其憑證(例如,在續約期間),則新憑證具有不同的指紋。證書固定(在應用程式中對指紋或一小組可接受的指紋進行硬編碼)是一種檢測證書變更的安全技術。如果伺服器提供具有不同指紋的證書,應用程式將拒絕它。這可以防止受損的 CA 頒發瀏覽器本來信任的詐欺性憑證。

憑證固定需要仔細管理:如果伺服器更新其憑證而您沒有預料到,您的應用程式將拒絕有效的新憑證。許多應用程式使用公鑰固定,即固定公鑰而不是整個憑證。只要使用相同的金鑰,這就允許憑證續約而不會被拒絕。

工作範例:使用協定感知工具進行驗證,因為 ToolAcre 雜湊貼上了 UTF-8 文字,而不是 DER 或 SSH 線路位元組

手動計算指紋以進行驗證非常簡單。將憑證或金鑰儲存到檔案中,使用 `openssl dgst -sha256 filename` 或 `ssh-keygen -l -f filename -E sha256` 顯示指紋,並與伺服器向您顯示的指紋進行比較。如果您貼上金鑰字節,ToolAcre SHA 雜湊計算器還可以計算摘要,但請記住,計算器會雜湊您貼上的 UTF-8 文字,而不是二進位檔案。如果金鑰採用 PEM 格式(帶有 `-----BEGIN CERTIFICATE-----` 標頭和 base64 編碼位元組的文字),您可以將其貼到計算器中。如果是DER格式(二進位),則需要使用命令列工具或先轉換為PEM。

邊界很重要:ToolAcre 會對您貼到計算器介面中的 UTF-8 文字進行雜湊處理。它不會從您的裝置讀取檔案(所有計算都在瀏覽器、分頁中進行,沒有網路)。如果磁碟上有金鑰檔案,則可以在文字編輯器中開啟它,複製文字並貼上到計算器(如果它是 PEM 格式)。或者您可以使用 `openssl`、`ssh-keygen` 或 `sha256sum` 等命令列工具在本機計算雜湊值。

重點:比較帶外指紋 - ToolAcre SHA 雜湊計算器顯示 SHA-1 和 SHA-256 摘要在指紋使用的長度下的樣子

ToolAcre SHA 雜湊計算器顯示任何文字輸入的 SHA-1 和 SHA-256 摘要。如果您貼上 PEM 格式的憑證或 SSH 公鑰,則計算器將計算這兩個摘要。對於 SSH 金鑰,計算器將對您貼上的文字進行雜湊處理;如果您貼上標準的 base64 編碼的 SSH 公鑰格式,則摘要將與 SSH 指紋不匹配,因為 SSH 在散列之前應用自己的格式(有線格式)。對於直接匹配,您需要採用 SSH 內部使用的確切格式的金鑰,這不是公共顯示格式。

對於憑證指紋,行為類似:如果您貼上 PEM 編碼的憑證文字,計算器會對該文字進行雜湊處理。憑證的指紋是透過編碼的憑證位元組(DER 格式)計算的,而不是 PEM 文字包裝器。位元組相同,但文字編碼不同。要匹配 OpenSSL 或瀏覽器憑證檢視器的憑證指紋,您需要提供人類無法讀取的 DER 位元組。此計算器的目的是對您可以貼上和讀取的 UTF-8 文字進行雜湊處理,從而使邊界清晰:它對文字輸入進行哈希處理,而不是對標準二進製或有線協定形式的加密金鑰檔案進行雜湊處理。