關於SSH主機密鑰算法的問題
我目前正在為我的碩士學位寫一份關於 SSH 協議的報告。很有趣!但是,我無法進入主機密鑰算法的內部工作。
例如,根據 RFC4253,“ssh-rsa”是伺服器生成 RSA 密鑰對的密鑰格式。到目前為止,一切都很好。但是,我似乎不明白 SHA-1 在哪裡發揮作用。
RFC8332 說
“SSH 最初使用帶有 SHA-1 的 RSA 為伺服器和客戶端身份驗證定義了公鑰算法“ssh-rsa”。
我的理解是伺服器使用 SHA-1 計算公鑰的雜湊值,並在適當的時候將公鑰部分及其 SHA-1 計算的雜湊值發送給客戶端。
我對麼?
這與我們第一次連接到 SSH 伺服器時顯示的指紋沒有任何關係,是嗎?如果沒有,我該如何計算(沒有 ssh-keygen)?
非常感謝!
例如,根據 RFC4253,“ssh-rsa”是伺服器生成 RSA 密鑰對的密鑰格式。到目前為止,一切都很好。但是,我似乎不明白 SHA-1 在哪裡發揮作用。
見第 6.6 節:
Signing and verifying using this key format is performed according to the RSASSA-PKCS1-v1_5 scheme in [RFC3447] using the SHA-1 hash. The resulting signature is encoded as follows: [snipped]
正如該參考文獻RFC3447 第 8.2 節所指出的那樣,定義瞭如何執行此簽名方案;特別是它在第 9.2 節中使用了 EMSA-PKCS1-v1_5,首先將選定的雜湊(在本例中為 SHA-1)應用於要簽名的數據。大多數其他數字簽名方案,包括 DSA(在 SSH 中稱為 DSS)和 ECDSA,也是從對數據進行雜湊處理開始的,但您沒有詢問它們。
RFC8332 說“SSH 最初使用帶有 SHA-1 的 RSA 定義了用於伺服器和客戶端身份驗證的公鑰算法“ssh-rsa”。
這是正確的,在第 1 節中。第 3 節解釋了用於 ssh-rsa的相同密鑰對被重新用於新的 SHA-2 方案,但是:
Signing and verifying using these algorithms is performed according to the RSASSA-PKCS1-v1_5 scheme in [RFC8017] using SHA-2 [SHS] as hash. For the algorithm "rsa-sha2-256", the hash used is SHA-256. For the algorithm "rsa-sha2-512", the hash used is SHA-512.
(RFC8017 是 PKCS1v2.2,是對 RFC3447 PKCS1v1.1 的更新。算法和方案相同,但增加了一些新的雜湊。SHS 是 FIPS 180-4,定義 SHA-1 的 NIST 標準的目前版本和 SHA-2,包括 SHA-256 和 SHA-512。)
我的理解是伺服器使用 SHA-1 計算公鑰的雜湊值,並在適當的時候將公鑰部分及其 SHA-1 計算的雜湊值發送給客戶端。
我對麼?
不。伺服器發送實際公鑰,編碼如 RFC4253 6.6 所示,在 RFC8332 3 中未更改。如上所述,雜湊(SHA-1、SHA-256 或 SHA-512)作為數據的一部分應用於數據簽名方案。
這與我們第一次連接到 SSH 伺服器時顯示的指紋沒有任何關係,是嗎?如果沒有,我該如何計算(沒有 ssh-keygen)?
否。如果您確實想計算OpenSSH使用的指紋(不一定是其他實現),它是帶冒號的十六進制 MD5(對於舊版本)或 base64 中的 SHA256(對於較新版本)線上發送的密鑰編碼. OpenSSH 還將密鑰 blob 儲存在 id_xxx.pub、known_hosts 和 authorized_keys 文件中的 base64 中,因此您無需實際建構編碼,只需 base64-decode 並從這些文件之一中散列適當的欄位。
如果要在 SSH2 協議中生成或驗證簽名,則需要待簽名數據,如RFC4253 第 8 節中所述,該數據是“交換雜湊”,它是根據包括只有兩者知道的 DH 共享密鑰的數據計算得出的特定連接的端點,因此這種計算可以並且只能由像程序一樣建立特定連接/會話的
ssh
程序來完成。
SSH 的原理是在客戶端-伺服器會話中實現安全(即機密和經過身份驗證的)通信通道。新版本的 SSH(稱為 SSH2)使用公鑰基礎設施來驗證伺服器。這通常是很重的東西,但使用者可以輕鬆繞過它:只要有安全警告,他只需點擊“確定”即可。
- SSH2 使用 DSS 進行伺服器身份驗證,使用 Diffie-Hellman 密鑰協議設置對稱會話密鑰(以前的版本完全基於 RSA)。兩者都基於一些生成器 $ g $ 生成一個子組 $ \mathbb{Z}^{∗}_p $ 素數的 $ q $ .
- 客戶隨機選擇 $ {x \in {1,…, q − 1}} $ , 計算 $ {e = g^x \mod p} $ ,並將其發送到伺服器。
- 伺服器隨機選擇一個 $ {y \in {1,…, q − 1}} $ , 計算 $ {f = g^y \mod p} $ 和 $ {K = e^y \mod p} $ .
- 現在伺服器使用各種其他值計算雜湊 H 並對其進行簽名, $ {s=sig(H)} $ 。在哪裡 $ {K_S} $ 是他的公鑰,並發送 $ {K_S} $ , $ f $ , 和簽名 $ s $ 給客戶。這個 $ H $ 可以從 SHA-1 生成。
- 現在,當您第一次連接到機器時,您將被告知無法建立真實性並提供密鑰指紋進行檢查。
- 此指紋是從伺服器公鑰生成的,可能是 SHA1 或 SHA256。
- 你可以使用:- $ ssh-keygen -lf ~/.ssh/id_rsa.pub