一、问题起源
给服务器做完 SSH 密钥加固后,产生一个疑问:
“私钥就是一个 256 位随机数,那我把密码也换成 256 位随机字符串,效果不是一样吗?”
答案:不一样。熵相同,机制完全不同。
二、核心区别
密码认证:秘密必须出门
你 ──发送密码──→ 服务器
↓
服务器拿收到的密码与存储的凭证比对
↓
问题:
1. 秘密在认证过程中"离开"了你的电脑
2. 服务器必须持有可验证凭证(明文或哈希)
3. 服务器被拖库 → 全用户秘密泄露(哈希可离线爆破)
4. 中间人截获 → 直接冒充你
密钥认证:秘密一生不出门
你 ←──随机考题── 服务器
↓
私钥在本地对考题签名
↓
你 ──只发签名──→ 服务器
↓
服务器用公钥验签
↓
问题全部化解:
1. 私钥从不出本机
2. 服务器只有公钥(= 锁),公钥泄露无所谓
3. 服务器被拖库 → 攻击者拿到锁,没用
4. 截获签名 → 签名只对当次随机考题有效,下道题变了就作废
三、256 位随机数的双重身份
原料相同:
密码和私钥都用 256 位随机数做原料
用法不同:
密码 = 把原料"递给对方看"
私钥 = 把原料锁在保险箱,只展示"开锁结果"
暴力破解难度相同:
2^256 ≈ 1.15 × 10^77 ≈ 宇宙原子总数
→ 都不可爆破
但风险面不同:
密码在传输和存储环节暴露面大
私钥的风险只剩"文件被偷"这一个点
四、SSH 挑战-应答认证完整流程

阶段1:建立加密通道
① TCP 连接
②③ DH/ECDH 密钥交换 → 会话加密
阶段2:服务器出示身份
④ 主机密钥指纹
⑤ 客户端与 known_hosts 对照(防中间人)
阶段3:认证(挑战-应答)
⑥ 客户端申请 publickey 认证
⑦ 服务器发 256 位随机考题(每次不同)
⑧ 私钥本地签名(私钥不出本机)
⑨ 返回签名
⑩ 服务器公钥验签
⑪ 通过 / 拒绝
五、这个模式的通用性
挑战-应答(Challenge-Response)是密码学经典模式:
SSH → publickey 认证
HTTPS → TLS 证书验证同源思想
U 盾 → 银行发题,盾内签名
Kerberos → 域登录"验证明不传密码"
设计思想一句话:
证明"我持有秘密",而不是把秘密给你看。
六、实践推论
1. 服务器失守对比:
密码模式 → 拖库 = 秘密全泄露
密钥模式 → 拖库 = 只拿到公钥,白拿
2. 中间人窃听对比:
密码模式 → 截获 = 冒充
密钥模式 → 截获签名 = 下道考题作废
3. 私钥唯一风险:文件被偷(木马/网盘/社工)
缓解:加 passphrase、不传网盘、查登录日志
附录:关键概念速查
| 概念 | 说明 |
|---|---|
| 私钥 | 256 位随机数,固定不变,永不出本机 |
| 公钥 | 私钥的数学对偶,可公开,用于验签 |
| 考题 | 服务器每次随机生成的 256 位串 |
| 签名 | 私钥对考题的计算结果,每次不同 |
| authorized_keys | 服务器上存公钥的文件 |
| known_hosts | 本地存服务器指纹的文件 |
本文由 myrocky SSH 加固实践引出,PlantUML 图渲染于 2026-09-16。