一、问题起源

给服务器做完 SSH 密钥加固后,产生一个疑问:

“私钥就是一个 256 位随机数,那我把密码也换成 256 位随机字符串,效果不是一样吗?”

答案:不一样。熵相同,机制完全不同。


二、核心区别

密码认证:秘密必须出门

你 ──发送密码──→ 服务器
        ↓
服务器拿收到的密码与存储的凭证比对
        ↓
问题:
  1. 秘密在认证过程中"离开"了你的电脑
  2. 服务器必须持有可验证凭证(明文或哈希)
  3. 服务器被拖库 → 全用户秘密泄露(哈希可离线爆破)
  4. 中间人截获 → 直接冒充你

密钥认证:秘密一生不出门

你 ←──随机考题── 服务器
        ↓
私钥在本地对考题签名
        ↓
你 ──只发签名──→ 服务器
        ↓
服务器用公钥验签
        ↓
问题全部化解:
  1. 私钥从不出本机
  2. 服务器只有公钥(= 锁),公钥泄露无所谓
  3. 服务器被拖库 → 攻击者拿到锁,没用
  4. 截获签名 → 签名只对当次随机考题有效,下道题变了就作废

三、256 位随机数的双重身份

原料相同:
  密码和私钥都用 256 位随机数做原料

用法不同:
  密码  = 把原料"递给对方看"
  私钥 = 把原料锁在保险箱,只展示"开锁结果"

暴力破解难度相同:
  2^256 ≈ 1.15 × 10^77 ≈ 宇宙原子总数
  → 都不可爆破

但风险面不同:
  密码在传输和存储环节暴露面大
  私钥的风险只剩"文件被偷"这一个点

四、SSH 挑战-应答认证完整流程

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。