不喜欢广告? 无广告 今天

SSH Keys Explained Ed25519 与 ECDSA 与 RSA(别按回车键)

更新于

你输入了 ssh-keygen,按了 Enter 四次,最终得到了 RSA。以下是为什么 Ed25519 是正确的选择,ECDSA 的错误之处,以及 RSA 实际上唯一需要的场景。

SSH Keys Explained: Ed25519 vs ECDSA vs RSA (Stop Pressing Enter) 1
广告 移除?

每个开发者都曾这样做过。你输入 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-keychainssh-add 以便口令在重启后仍然有效。在Linux中,大多数桌面环境会自动启动ssh-agent——可通过检查 echo $SSH_AUTH_SOCK.

你连续按了四次回车键而没有阅读。口令提示是值得回头查看的。

想要享受无广告的体验吗? 立即无广告

安装我们的扩展

将 IO 工具添加到您最喜欢的浏览器,以便即时访问和更快地搜索

添加 Chrome 扩展程序 添加 边缘延伸 添加 Firefox 扩展 添加 Opera 扩展

记分板已到达!

记分板 是一种有趣的跟踪您游戏的方式,所有数据都存储在您的浏览器中。更多功能即将推出!

广告 移除?
广告 移除?
广告 移除?

新闻角 包含技术亮点

参与其中

帮助我们继续提供有价值的免费工具

给我买杯咖啡
广告 移除?