SSH Keys Explained Ed25519 与 ECDSA 与 RSA(别按回车键)
你输入了 ssh-keygen,按了 Enter 四次,最终得到了 RSA。以下是为什么 Ed25519 是正确的选择,ECDSA 的错误之处,以及 RSA 实际上唯一需要的场景。
每个开发者都曾这样做过。你输入 ssh-keygen,一个向导会出现,询问密钥类型、位长度、口令、输出路径等问题——你只需不断按回车键,直到随机艺术指纹出现。恭喜,你现在拥有了一个RSA-2048密钥,但你并不知道这个数字为何如此。
简短答案: 使用Ed25519。运行 ssh-keygen -t ed25519 -C "you@example.com" 然后停止阅读2012年的StackOverflow回答。本文其余部分将解释原因——以及说明在哪些情况下确实需要使用RSA。
三种算法
RSA
RSA(Rivest–Shamir–Adleman,1977)多年来一直是互联网默认的公钥算法。其安全性依赖于大整数分解的难度,这意味着你需要使用大密钥才能保持安全——至少2048位,最好4096位。一个4096位的RSA公钥大约为800字节。每次连接都需要对这些大数进行运算,速度比现代替代方案慢。
RSA唯一真正存在的理由是兼容性。较老的SSH服务器、遗留硬件、2010年代初的专有网络设备——它们都支持RSA。如果你连接的是在奥巴马政府时期配置且此后从未更改过的系统,那么RSA可能是你唯一的选择。
ECDSA
ECDSA(椭圆曲线数字签名算法)作为一种比RSA更快、更小的替代方案出现。一个256位的ECDSA密钥提供的安全性大致相当于一个3072位的RSA密钥。更优的数学方法、更小的密钥、更快的操作——听起来是个胜利。
问题在于OpenSSH默认使用的曲线:NIST曲线(P-256、P-384、P-521)。这些曲线存在合理担忧。NIST在椭圆曲线标准中的参与历史上存在争议——该机构曾帮助标准化了Dual_EC_DRBG,这是一种受NSA影响的随机数生成器,后来被发现存在后门。ECDSA本身并未被破解,但NIST曲线的参数设计标准缺乏透明性。没有人能证明这些参数没有被选择以提供某种非对称优势。大多数开发者并非NSA目标,但当一个可证明更优的替代方案存在时,我们不应接受“可能没问题”这种说法。
Ed25519
你应该使用Ed25519(在Curve25519上的EdDSA)。它由Daniel J. Bernstein设计,具有完全公开的设计标准——曲线参数来自“无秘密”数字,而非一个不透明的委员会过程。
实际数值:一个Ed25519公钥为68字节。签名和验证速度比RSA和ECDSA都快。该算法在设计上免疫于定时侧信道攻击——没有依赖秘密的分支,没有可变时间操作。该功能自2014年OpenSSH 6.5版本起支持。GitHub、GitLab和Bitbucket均已支持多年。与ECDSA相比没有缺点,相比RSA则有全部优点。
并排比较
| 财产 | RSA(4096位) | ECDSA(P-256) | Ed25519 |
|---|---|---|---|
| 公钥大小 | 约800字节 | 约200字节 | 68字节 |
| 等效安全性 | 约140位 | 约128位 | 约128位 |
| 签名速度 | 慢 | 快 | 非常快 |
| 抗定时攻击 | 不 | 不 | 是(设计如此) |
| 曲线信任问题 | 没有任何 | NIST曲线(存在争议) | 无(Curve25519) |
| OpenSSH支持自 | 始终支持 | 5.7 (2011) | 6.5 (2014) |
| GitHub / GitLab / Bitbucket | 是的 | 是的 | 是的 |
如何生成每种类型
首选方案——使用此方法:
ssh-keygen -t ed25519 -C "you@example.com"
旧系统需要RSA?至少使用4096位:
ssh-keygen -t rsa -b 4096 -C "you@example.com"
ECDSA,如果你有特定原因要避免使用Ed25519(你大概没有):
ssh-keygen -t ecdsa -b 521 -C "you@example.com"
如果你希望使用界面而不是记忆命令行标志,可以使用 IO Tools上的SSH密钥生成器 可让你在不接触终端的情况下选择算法、位长度和口令选项。
何时真正需要RSA
存在一些合法情况,Ed25519不可用:
- 2014年之前的SSH守护进程 ——任何运行OpenSSH早于6.5版本的系统将无法接受Ed25519。虽然罕见,但确实存在:嵌入式系统、网络设备、旧版RHEL 6系统,这些系统从未更新OpenSSH。
- FIPS-140-2环境 ——联邦机构和部分受监管的企业环境强制要求使用FIPS验证的算法。Ed25519未获FIPS批准。在这些环境中应使用RSA-3072+或使用P-384的ECDSA。
- 组织内部SSH证书颁发机构策略 ——一些公司运行自己的SSH证书颁发机构,并强制要求特定密钥类型。在生成密钥前请务必检查,以免在注册时被拒绝。
除了这三种情况,RSA的使用理由只是惯性,而非合理性。
你跳过的口令
什么时候 ssh-keygen 会要求输入口令,你按回车键跳过,你的私钥将以明文形式保存在磁盘上。如果有人获取你的笔记本电脑,他们就能访问该密钥所关联的所有内容——所有服务器、所有Git主机、所有生产环境。务必添加口令。使用 ssh-agent 以便你只需在会话中输入一次:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
在macOS上添加 --apple-use-keychain 到 ssh-add 以便口令在重启后仍然有效。在Linux中,大多数桌面环境会自动启动ssh-agent——可通过检查 echo $SSH_AUTH_SOCK.
你连续按了四次回车键而没有阅读。口令提示是值得回头查看的。
