為什麼 OpenSSH 更喜歡 ECDSA nistp256 密鑰而不是 -384 和 -521 以及 Ed25519 來驗證主機密鑰?
根據
ssh_config(5)
,HostKeyAlgorithms
“指定客戶端要按優先順序使用的主機密鑰算法……預設為:ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521-cert-v01@openssh.com, ssh-ed25519-cert-v01@openssh.com, rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com, ssh-rsa-cert-v01@openssh.com, ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
這在 Ed25519 密鑰之前列出了 ECDSA 密鑰,並且還更喜歡帶有曲線 nistp256 的 ECDSA 密鑰而不是 nistp384 和 nistp521。
我的印像是 Ed25519 通常優於 ECDSA 密鑰,並且具有較高n曲線的密鑰,至少在這三個中,更安全。
那麼為什麼 OpenSSH 按這個順序列出算法呢?
另外,我正在開發一個使用 SSH 作為傳輸的 Android 應用程序。它還需要一個首選主機密鑰算法列表。在應用程序中複製 OpenSSH 的列表是個好主意嗎?或者我應該更喜歡 ed25519 而不是 ecdsa 與 nistp521 而不是 -384 而不是 -256 而不是 rsa 鍵?
如果我沒記錯的話,這只是一個性能問題。請記住,
HostKeyAlgorithms
確定用於向客戶端驗證伺服器的方法,它不會生成會話密鑰。ECDSA算法比RSA快,小密鑰比大密鑰快,在5.7更改預設值時,changelog特別引用了性能原因,見第一個特性項。
出於兼容性原因,NIST 密鑰可能比 ED25519 更受歡迎,在發現伺服器不支持它們之後,我不得不在基於 Curve25519 的密鑰之後生成 NIST 密鑰,所以這完全有意義。基於 Curve25519 的密鑰可能更安全,除非您詢問 NIST,否則他們說它們同樣安全。
由於這些只是預設選項,您當然可以隨意更改它們或強制使用特定算法,我已為我的預設主機密鑰方法強制使用 3072 位 RSA。請記住,這是一個選擇選項,如果列表中的某個鍵類型不存在,則不會使用它。如果您的配置中只有 RSA 密鑰,則會跳過所有 EC 選項,您可以隨意刪除它們。
如果您使用 SSH 進行傳輸並且您可以控制應用程序和伺服器,則只需生成 1 個您想要的主機密鑰並完成它,並忽略配置選項,因為它們無關緊要。
所以我很好奇事情實際上有多快。顯然,您可以使用
$ openssl speed
來查看某些操作的速度。但是,我不確定這在連接到 SSH 伺服器時如何轉化為實際的性能問題。作為 Diffie-Hellman 密鑰交換的一部分,SSH 伺服器計算某個雜湊值,然後使用其私有主機密鑰對其進行簽名。然後客戶端計算相同的雜湊並驗證伺服器簽名。所以看看這兩個操作有多慢是很有用的。簽名操作可能更重要,因為伺服器往往比客戶端擁有更多的 SSH 連接。
簽名/驗證操作通常會涉及另一個散列操作;它將成為主機密鑰驗證算法的一部分。例如
ssh-rsa
,將要使用sha1
和ecdsa-sha2-nistp521
將要使用sha512
。我不確定下面的數字是否包括雜湊時間。在任何一種情況下,似乎數據 > 16 字節sha256
並且sha512
性能相當。我在三個設備上進行了測試:
- Thinkpad X220,英特爾酷睿 i5-2520M
sign verify sign/s verify/s rsa 2048 bits 0.001350s 0.000048s 740.8 20913.2 rsa 3072 bits 0.006107s 0.000094s 163.7 10639.3 rsa 4096 bits 0.010134s 0.000158s 98.7 6316.4 rsa 7680 bits 0.089906s 0.000525s 11.1 1903.0 rsa 15360 bits 0.468636s 0.002004s 2.1 499.0 dsa 2048 bits 0.000600s 0.000519s 1667.5 1927.0 256 bits ecdsa (nistp256) 0.0000s 0.0001s 23594.7 7348.1 384 bits ecdsa (nistp384) 0.0016s 0.0011s 620.4 890.8 521 bits ecdsa (nistp521) 0.0005s 0.0009s 1866.4 1080.1 253 bits EdDSA (Ed25519) 0.0001s 0.0002s 15737.2 6078.1
- 小米米 A2,高通 SDM660 金魚草 660
sign verify sign/s verify/s rsa 2048 bits 0.004257s 0.000111s 234.9 9030.1 rsa 3072 bits 0.012975s 0.000243s 77.1 4116.7 rsa 4096 bits 0.029138s 0.000425s 34.3 2353.9 rsa 7680 bits 0.220952s 0.001460s 4.5 684.9 rsa 15360 bits 1.362500s 0.005801s 0.7 172.4 dsa 2048 bits 0.001530s 0.001434s 653.8 697.3 256 bits ecdsa (nistp256) 0.0001s 0.0003s 12472.4 3907.9 384 bits ecdsa (nistp384) 0.0032s 0.0025s 311.4 396.6 521 bits ecdsa (nistp521) 0.0081s 0.0062s 123.1 161.9 253 bits EdDSA (Ed25519) 0.0002s 0.0004s 6284.5 2412.9
- 樹莓派 3 B 型修訂版 1.2,Cortex-A53
sign verify sign/s verify/s rsa 2048 bits 0.011919s 0.000268s 83.9 3735.0 rsa 3072 bits 0.032787s 0.000550s 30.5 1819.5 rsa 4096 bits 0.069583s 0.000934s 14.4 1070.1 rsa 7680 bits 0.381111s 0.003097s 2.6 322.9 rsa 15360 bits 2.725000s 0.012002s 0.4 83.3 dsa 2048 bits 0.003586s 0.003021s 278.9 331.0 256 bits ecdsa (nistp256) 0.0004s 0.0013s 2249.3 743.5 384 bits ecdsa (nistp384) 0.0181s 0.0127s 55.1 78.5 521 bits ecdsa (nistp521) 0.0421s 0.0287s 23.7 34.8 253 bits EdDSA (Ed25519) 0.0005s 0.0012s 2156.7 800.2
這是圖表,線性和對數。Y 軸是
sign/s
(實心,圓形)和verify/s
(虛線,三角形)。藍色是 X220,橙色是小米,紅色是樹莓派。我在這裡的收穫是 ECDSA nistp256在簽名方面比其他 ECDSA 密鑰快得多*。*在 Raspberry pi 上,使用 nistp384 和 521 會導致每秒最多 55.1 或 23.7 次簽名操作——這些對我來說看起來像是糟糕的預設值。
Ed25519 比 ECDSA 稍慢一些,尤其是在簽名方面,但速度並不慢。
此外,令人驚訝的是,nistp521 在 Intel CPU 上的性能優於 nistp384。