SSH 密鑰類型的的選擇(RSA, DSA or Other)
在用 ssh-keygen 生成密鑰對時,通常會面臨是使用RSA還是DSA的選擇:RSA or DSA, this is a question! 今天在這里分析一下:
原理與安全性
RSA 與 DSA 都是非對稱加密算法。其中RSA的安全性是基於極其困難的大整數的分解(兩個素數的乘積);DSA 的安全性是基於整數有限域離散對數難題。基本上可以認為相同密鑰長度的 RSA 算法與 DSA 算法安全性相當。
有點要注意,RSA 的安全性依賴於大數分解,但是否等同於大數分解一直未能得到理論上的證明,因為沒有證明破解 RSA 就一定需要作大數分解。不過也不必太過擔心,RSA 從誕生以來,經歷了各種攻擊,至今未被完全攻破(依靠暴力破解,小於1024位密鑰長度的 RSA 有被攻破的記錄,但未從算法上被攻破)。
用途:
DSA 只能用於數字簽名,而無法用於加密(某些擴展可以支持加密);RSA 即可作為數字簽名,也可以作為加密算法。不過作為加密使用的 RSA 有着隨密鑰長度增加,性能急劇下降的問題。
性能:
相同密鑰長度下,DSA 做簽名時速度更快,但做簽名驗證時速度較慢,一般情況驗證簽名的次數多於簽名的次數。
相同密鑰長度下,DSA (在擴展支持下)解密密文更快,而加密更慢;RSA 正好反過來,一般來說解密次數多於加密次數。不過由於非對稱加密算法的先天性能問題,兩者都不是加密的好選擇。
業界支持:
在業界支持方面,RSA 顯然是贏家。RSA 具有更為廣泛的部署與支持。
使用 ssh-keygen 時的選擇:
上面說了那么多,可以看到RSA 與 DSA 各有優缺點。回到開頭的問題,在使用 ssh-keygen 時,RSA 與 DSA到底選哪個? 比較有意思的是,這個問題最終答案與上面那些優缺點無關。雖然理論上可以生成更長長度的 DSA 密鑰 (NIST FIPS 186-3),但ssh-keygen在生成 DSA 密鑰時,其長度只能為1024位(基於NIST FIPS 186-2);而 ssh-keygen 在 RSA 的密鑰長度上沒有限制。
由於小於1024位密鑰長度的 RSA 已經有被攻破的記錄,所以說現在:RSA 2048 位密鑰是更好的選擇。
其它選擇:
RSA 與 DSA 各有優缺點,那有沒一個更好的選擇呢?答案是肯定的,ECC(Elliptic Curves Cryptography):橢圓曲線算法。
ECC 與 RSA 相比,有以下的優點:
(1)相同密鑰長度下,安全性能更高,如160位ECC已經與1024位RSA、DSA有相同的安全強度。
(2)計算量小,處理速度快,在私鑰的處理速度上(解密和簽名),ECC遠 比RSA、DSA快得多。
(3)存儲空間占用小 ECC的密鑰尺寸和系統參數與RSA、DSA相比要小得多, 所以占用的存儲空間小得多。
(4)帶寬要求低使得ECC具有廣泛得應用前景。
在 ssh-keygen 中,ECC 算法的相應參數是 “-t ecdsa”。可惜的是由於橢圓曲線算法只有在較新版本的 openssl 與 ssh-keygen 中才被支持,而無法得到普遍使用而去完全替代 RSA/DSA。不過由於橢圓曲線算法的優點,使其取代 RSA/DSA 而成為新一代通用的非對稱加密算法成為可能,至少 SET 協議的制定者們已經把它作為下一代 SET 協議中缺省的公鑰密碼算法了。
參考:
1)http://security.stackexchange.com/questions/5096/rsa-vs-dsa-for-ssh-authentication-keys
2)http://iask.sina.com.cn/b/7132379.html
3)http://msdn.microsoft.com/zh-cn/library/ms978415.aspx
4)http://topic.csdn.net/u/20091019/10/DF64616B-4EA0-440A-B96F-A0F2A751CA50.html