SSH 密码认证 vs 密钥认证:该用哪种?

密钥认证更安全、更方便,密码认证仅作为初始配置或备用方案

对比

维度SSH 密码认证密钥认证
安全性 容易被暴力破解,密码可能被窃听或社工获取 基于非对称加密,私钥不在网络传输,几乎无法暴力破解
便利性 每次连接需要输入密码,无法自动化 配置后免密登录,支持自动化脚本和 CI/CD
管理成本 需要记忆密码,定期更换,多服务器密码管理困难 一对密钥可用于多台服务器,吊销只需删除 authorized_keys 中的条目
自动化支持 不支持无人值守操作,脚本中硬编码密码极不安全 完美支持 CI/CD、cron 任务、自动化部署等场景
初始配置 零配置,开箱即用 需要生成密钥对并分发公钥,有一次性配置成本
多因素认证 可配合 TOTP/短信验证码实现 MFA 可设置 passphrase 作为第二因素,或配合硬件密钥(FIDO2)

使用场景

什么时候用 SSH 密码认证

  • 首次连接服务器进行初始配置(还没有部署公钥)
  • 临时使用他人电脑紧急登录(不方便导入私钥)
  • 配合 MFA 作为额外安全层(密钥 + 密码 + OTP)
  • 极少使用的备用恢复通道

什么时候用 密钥认证

  • 日常服务器管理和开发工作
  • CI/CD 流水线自动部署
  • Git over SSH(GitHub/GitLab)
  • 自动化脚本和定时任务
  • 管理多台服务器
  • 任何生产环境

示例

passwordExample

# 密码认证连接
ssh user@server
# 每次都要输入密码
user@server's password: ********

keyExample

# 密钥认证配置(一次性)
ssh-keygen -t ed25519 -C "your@email.com"
ssh-copy-id user@server

# 之后每次连接
ssh user@server
# 直接登录,无需密码

常见错误

在脚本中明文存储密码(用 sshpass 等工具),应该用密钥认证
生成密钥后不设置 passphrase,私钥泄露等于直接暴露所有服务器
配置密钥认证后忘记禁用密码认证,攻击者仍可暴力破解密码
将私钥文件权限设为 644,SSH 会拒绝使用(必须 600)
把私钥上传到服务器或提交到 Git 仓库

建议

强烈推荐使用密钥认证。生成 Ed25519 密钥并设置 passphrase,配合 ssh-agent 缓存密码。配置完成后在服务端禁用密码认证(PasswordAuthentication no),配合 fail2ban 防护。密码认证仅保留为紧急恢复通道或初始配置使用。