TL;DR
把私钥放进硬件,解决的是「被偷走」,不是「被借用」。攻击者控制了你的机器,偷不走 YubiKey 里的钥匙;但只要钥匙插着、又不要求按一下,攻击者可以用它签任何东西。SSH 能忍这个剩余风险,因为一次滥用的上限是一次登录;钱包忍不了,因为一次签名就是终局。
- 四道门槛,不是一道。 不可导出、在场确认、身份验证、所见即所签。硬件天然只给第一道,第二、三道要你自己选,第四道 SSH 用不上、钱包离不开。
- 「设备绑定」不等于「设备驻留」。 YubiKey 的
ed25519-sk私钥从不离开设备;TPM 方案的私钥其实就在磁盘上,只是被 TPM 加密,而且不检查系统状态。 - 免触摸的硬件钥匙,就是交易所热钱包的形状。 私钥在硬件里没有泄露,但谁控制了发起签名的那个服务,谁就能签。币安十月那次的初步根因正是如此。
- 冗余有两种做法。 SSH 登记多把互相独立的钥匙,丢一把删一行;单签钱包只有一把钥匙,备份只能复制它——助记词就是一份可导出的完整私钥。
- 量子面前,不可导出不再是护城河。 公钥已经公开的密钥不需要被偷:GitHub 把每个用户的 SSH 公钥挂在
github.com/<用户名>.keys,以太坊账户第一次转出后公钥就能从签名里恢复。OpenSSH 默认的后量子方案只保护会话的密钥协商,不保护签名。 - 未来的私钥安全是「一组可撤换的钥匙」,不是「一把更难偷的钥匙」。 可撤换要求授权层能改:
authorized_keys天生如此,单签地址天生不行,多签与智能账户把它补了回来。
本文从 infected.systems 一篇 2026-11-04 的博客出发:作者删掉了所有磁盘上的 SSH 私钥,改用 YubiKey、TPM 和 Apple Secure Enclave 三种硬件方案。操作细节以原文和各工具文档为准;四道门槛的框架、与钱包的对照、量子一节是我加的。三种方案我没有逐一实测。
一、硬件到底改变了什么
传统做法是磁盘上一个设了密码的私钥文件。OpenSSH 用 bcrypt 派生的密钥加密它,文件本身泄露问题不大;但 ssh-agent 解密之后,私钥以明文待在内存里,直到会话结束。拿到 root 的攻击者可以把它从内存里取走——之后就是离线、无限期、在任何地方都能用。
硬件方案改变的正是这一点。私钥在安全芯片里生成,芯片只对外提供「用它签名」的接口,不提供「把它读出来」的接口。拿到 root 的攻击者仍然能调用这个接口,但只能在攻击者控制这台机器、而且设备插在上面的那段时间里用。
所以硬件把风险从「永久失窃」压缩成了「在线期间被借用」。这是实打实的进步,但它也说明了硬件没有做什么:它不判断该不该签,也不知道签的是什么。
二、四道门槛,经常被混成一道
| 门槛 | 防的是什么 | 防不了什么 | SSH 硬件钥匙的默认 |
|---|---|---|---|
| 不可导出 | 私钥被复制、离线使用 | 攻击者在线时直接调用 | 有 |
| 在场确认(按一下) | 机器被控制后的静默使用 | 用户被骗着按下去 | 有,可用 no-touch-required 关掉 |
| 身份验证(PIN / 指纹) | 设备落到别人手里后被使用 | 本人被诱导 | 没有,可用 verify-required 打开 |
| 所见即所签 | 签下的内容和以为的不一样 | —— | 用不上,也没有 |
前两道回答「有没有人在用」,第三道回答「是不是本人」,第四道回答「用来干什么」。SSH 的签名只是回应一次登录挑战,签的内容本身没有意义,所以第四道不存在。钱包不一样:签名本身就是转账、授权或代码委托,内容就是全部。
三、三种方案各给了几道
YubiKey(ed25519-sk) |
TPM(ssh-tpm-agent) |
Apple Secure Enclave(sc_auth) |
|
|---|---|---|---|
| 私钥在哪 | 设备里,从不离开 | 磁盘上,被 TPM 加密包裹 | Secure Enclave 里,标为不可导出 |
| 磁盘上的文件是什么 | 只是一个句柄 | 加密后的私钥 | 只是一个句柄 |
| 曲线 | Ed25519(也可 P-256) | ECDSA P-256 或 RSA | 只有 P-256 |
| 额外软件 | 不需要,OpenSSH 原生 | 需要 ssh-tpm-agent |
不需要,但要设 SSH_SK_PROVIDER |
| 在场确认 | 默认要按;可关,但服务端也得显式允许 | 没有物理在场,PIN 可选 | -t bio 要求 Touch ID |
| 绑定系统状态 | 不适用 | 不检查 PCR,换固件、换系统照样解封 | 不适用 |
| 坑 | 要买硬件 | 机器得有 TPM | 合盖模式下 Touch ID 不可用,生成和使用都会失败 |
生成命令都很短:
ssh-keygen -t ed25519-sk -O resident -O verify-required
ssh-tpm-keygen -N "<PIN>"
sc_auth create-ctk-identity -l "<标签>" -k p-256-ne -t bio表里最容易被忽略的是 TPM 那一列:设备绑定和设备驻留是两回事。 磁盘上的 .tpm 文件离开那块 TPM 就是废的,但私钥材料确实在磁盘上;再加上它不看 PCR,同一台机器换个系统启动,只要没设 PIN 照样能用。有 TPM 就用,但把 PIN 设上。
四、免触摸的硬件钥匙,就是热钱包的形状
原文提到一个需要无人值守的场景:开机自动挂载远程目录,没有人在旁边按 YubiKey。办法是生成 no-touch-required 的钥匙,并在服务器 authorized_keys 对应那一行前面显式加上同名选项——不加的话 OpenSSH 默认拒绝。
这时四道门槛只剩第一道。私钥照样偷不走,但任何拿到这台主机控制权的人都能静默调用它。
交易所热钱包的签名服务就是这个形状。 私钥在 HSM 或 MPC 里,从不导出;但签名请求由某个服务发起,没有人逐笔按确认。攻击者不需要偷钥匙,只需要变成那个「被允许请求签名」的身份。
站内十月那篇整理过币安给出的初步根因:一名 DevOps 工程师的笔记本被攻陷,攻击者借此进入服务容器,提交了未授权的提现;公告称未发现私钥泄露。这并不矛盾——私钥本来就不需要泄露。
对个人的启示是:如果真有一把钥匙必须免触摸,就让它单独一把、单独限权。authorized_keys 的每一行都可以带限制:
no-touch-required,restrict,from="10.0.0.5" sk-ssh-ed25519@openssh.com AAAA... nas-mountfrom= 锁定来源地址,restrict 关掉端口转发、代理转发和终端分配;需要的话再加 command= 把它锁死在单一命令上。这样即使它被静默调用,能做的事也很有限。热钱包对应的做法叫额度、白名单和延时,原理一样:承认这把钥匙会在没人看的时候被用,然后限制它能被用来干什么。
五、冗余:多把钥匙,还是一把钥匙的副本
硬件钥匙最实际的问题是丢。设备坏了、丢了、换机了,里面的私钥就没了,因为它本来就导不出来。
SSH 的解法很干净:authorized_keys 可以放任意多行。一把日常用的 YubiKey、一把锁在抽屉里的备用 YubiKey、一把 Mac 的 Secure Enclave——三把互相独立,都登记上。丢了一把,删掉对应那一行,其余照常。整个过程中没有任何一把私钥被复制过。
单签钱包没有这个结构。一个地址对应一把钥匙,想备份,只能把这把钥匙本身复制下来——这就是助记词。硬件钱包在日常使用中保证私钥不出设备,但旁边那张写着 24 个词的纸,是一份完整的、可导出的私钥。真正的安全边界是那张纸,不是那台设备。 从结构上说,硬件钱包加助记词更接近 TPM 方案(私钥材料存在于设备之外,靠别的东西保护),而不是 YubiKey 方案。
站内 Coldcard 种子风险那篇讨论的就是这条边界出问题时的后果:种子生成、熵源、单签失败点。
多签和智能账户把 SSH 的结构补了回来:多把独立的钥匙,按阈值授权,丢一把就换掉那一把。而 Secure Enclave 和大多数 passkey 用的正是 P-256 曲线——RIP-7212 让多条 L2 原生支持 P-256 签名验证,以太坊主网的对应提案是 EIP-7951。原文里那把放在 Mac 上的 SSH 钥匙,同一类钥匙可以直接成为智能账户的签名者之一。
同步型 passkey(iCloud 钥匙串、Google 密码管理器)走的是另一条路:私钥会加密同步到你的其他设备,换来丢一台不丢钥匙。这是拿不可导出去换可恢复,不是免费的——你信任的边界从一块芯片扩大到了整个同步体系。
六、第四道门槛:SSH 用不上,钱包离不开
SSH 钥匙被滥用,最坏是攻击者拿到一个会话。很糟,但有日志、可撤销、能止损。
钱包钥匙被滥用,一次签名就可能把资产转走,链上不可逆。所以钱包必须面对第四道门槛:你按下确认的时候,知不知道自己签的是什么。
2025 年 2 月的 Bybit 事件是这道门槛失守的样本:Safe 的前端被篡改,源头是 Safe 一名开发者的电脑被入侵;多签的签名者在硬件钱包上批准了一笔和界面显示完全不同的交易。硬件在场、按了确认、通过了身份验证——前三道全过,第四道没有。
这道门槛也不只在人这一层。站内币安事件那几篇讨论过 EIP-7702 的 Type-4 交易:to 是钱包自己、金额为 0、数据为空,只解析 calldata 的策略引擎会把它看成一笔无害的自转账。连机器做的「所见」都可能是错的。
两起事件还有一个共同点:起点都是一台工程师的电脑。开发机上的 SSH 私钥、云凭据、能调用签名服务的令牌,是同一条攻击路径上的几个环节。删掉磁盘上的私钥,不只是为了 SSH。
七、量子:不可导出防的是物理提取,不是数学
原文三种方案用的都是椭圆曲线:Ed25519 和 P-256。比特币和以太坊用的 secp256k1 也是。足够大的量子计算机运行 Shor 算法,可以从公钥直接算出私钥。
这时「不可导出」就失效了——攻击者不需要碰你的设备,只需要你的公钥。所以真正的问题变成:你的公钥已经公开到什么程度?
| 场景 | 公钥是否已暴露 |
|---|---|
| GitHub 上登记的 SSH 钥匙 | 是,任何人可从 github.com/<用户名>.keys 读取 |
服务器上的 authorized_keys |
拿到服务器即可读取 |
| 以太坊外部账户 | 第一笔转出之后,公钥可从签名中恢复 |
| 比特币 P2PKH / P2WPKH 地址 | 花费前只露哈希,花费时暴露;地址复用则长期暴露 |
| 比特币 Taproot(P2TR) | 输出里直接就是(调整后的)公钥 |
OpenSSH 从 9.0 起默认用混合后量子算法做密钥协商,10.0 起换成基于 ML-KEM 的混合方案。这防的是「现在录下流量、将来解密」,保护的是会话内容。登录用的签名钥匙没有变,仍然是椭圆曲线。 主流 FIDO2 硬件也还不支持后量子签名。
量子什么时候到,本文不预测。站内四月那篇整理过谷歌量子 AI 的一份估算:不到 50 万个量子比特、几分钟内完成攻击;谷歌据此把自己的后量子迁移时间表提前到 2029 年。
不管时间表是什么,两边的处境差别很大:
- SSH 的迁移几乎免费。 钥匙随时可以换,
authorized_keys只是个列表。等后量子签名进了硬件,生成新钥匙、登记、删掉旧的,一个下午的事。今天被抓取的 GitHub 公钥,只有在那把钥匙到时候还被信任时才有用。 - 单签地址的迁移等于搬家。 换钥匙就是把资产转到新地址;公钥已经暴露的旧地址,量子到来前不搬就是靶子。而协议层面的后量子签名,比特币和以太坊主网据本文所知都还在提案和研究阶段。
- 智能账户介于两者之间。 验证签名的逻辑本身是代码,换签名算法是升级授权层,不必搬资产。
八、所以未来的私钥安全长什么样
把上面几节合起来,方向是一致的:不是一把更难偷的钥匙,而是一组随时可以撤换的钥匙,加一个能改的授权层。
- 不可导出,交给硬件;
- 在场确认和身份验证默认打开,必须关掉的那一把单独限权;
- 所见即所签,签名前在设备屏幕上看到解码后的内容,拒绝盲签;
- 冗余靠多把独立的钥匙,不靠复制同一把;
- 授权层可修改,这样换算法、换设备、换掉被攻破的那一把,都不必推倒重来。
SSH 的 authorized_keys 很多年前就是这个结构,只是很少有人把它当成安全设计的范本。多签、智能账户、passkey 签名者,是钱包在补同一课。
九、个人可以马上做的事
- SSH:每台服务器至少登记两把硬件钥匙(一把日常、一把离线保管);生成时加
verify-required;必须免触摸的那把单独生成,用from=和restrict限权。 - 有 TPM 的 Linux 机器:可以用,但要知道私钥加密存在磁盘上、不绑定系统状态,务必设 PIN。
- 合盖使用的 Mac:Secure Enclave 的指纹方案会直接失败,外接带 Touch ID 的键盘,或插一把 YubiKey 5C Nano。
- GitHub:你的公钥是公开的;后量子签名可用之前无所谓,可用之后尽快轮换。
- 钱包:大额资产用多签或智能账户,签名者分布在不同硬件上;不要让助记词成为唯一的冗余;硬件屏幕上看不懂的签名一律不签。
- 开发机:它是攻击路径的起点。磁盘上不留明文私钥,云凭据和签名服务的令牌同样对待。
十、这篇说不了什么
- 没有实测。 三种方案的命令和行为以原文和各工具文档为准,不同系统版本可能有差异。
- 硬件本身也会有漏洞。 2024 年公开的 EUCLEAK 侧信道影响固件 5.7 之前的 YubiKey 5 系列,利用需要物理接触和专门设备。本文不评估具体芯片的安全性。
- 不预测量子时间表。 引用的估算来自站内整理,不是本文的判断。
- 不是安全审计。 适合你的方案取决于你的威胁模型;原文作者自己也说,设了密码的磁盘钥匙对多数人已经够用。
结论。 那篇博客的标题是「我删掉了所有 SSH 密钥」,更准确的说法是:作者把每一把钥匙都换成了偷不走的。这是对的第一步。第二步是承认偷不走的钥匙仍然可以被借用——所以要在场确认、身份验证、限权。第三步是承认钥匙会丢、算法会过时——所以要多把、可撤换、授权层可改。SSH 用一个文本文件就做到了后两步;钱包花了很多年,才在多签和智能账户里把它补回来。
资料:I deleted all my SSH keys(infected.systems,2026-11-04);ssh-tpm-agent。站内链接见正文。本文为技术整理,不构成安全审计。