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 防护。密码认证仅保留为紧急恢复通道或初始配置使用。