必须升级密码哈希算法,因MD5/SHA-1可碰撞、无盐、计算过快易被爆破;推荐bcrypt(通用)、Argon2id(高安全)、PBKDF2-SHA512(合规);Linux需改PAM、设默认、强制重设;应用层应懒迁移并验证。

服务器账户安全的核心之一,是把密码从明文变成不可逆、难破解的哈希值。直接存密码或用 MD5/SHA-1 这类快哈希,等于给攻击者递钥匙。升级哈希算法不是“锦上添花”,而是堵住最常被利用的突破口。
为什么必须升级?旧算法真不安全了
MD5 和 SHA-1 已被实证可碰撞,几秒就能伪造校验;它们不加盐,相同密码哈希完全一致,彩虹表一查就中;而且计算太快,GPU 每秒能跑上亿次——暴力破解 8 位弱口令只需几小时。SHA-256 或 SHA-512 单独用也不够,缺盐、缺迭代、缺内存抗性,仍易被离线爆破。
选哪个算法?按场景分三档推荐
通用首选:bcrypt
– 内置随机盐,自动处理,无需开发者干预
– 成本因子(cost)可调(建议 12–14),兼顾安全与性能
– PHP 的 password_hash()、Java 的 JBCrypt、Python 的 bcrypt 库都原生支持
高安全优先:Argon2id
– OWASP 和 NIST 推荐,内存硬、时间硬、抗 GPU/ASIC
– Authelia、Serverpod、PHP 7.2+ 均默认或原生支持
– 示例参数:m=65536,t=3,p=4(64MB 内存、3 轮、4 线程)
合规刚需:PBKDF2-SHA512
– FIPS 140-2 认证,适合金融、政务等强合规场景
– 迭代次数建议 ≥ 600,000(NIST SP 800-132)
– Java 的 SecretKeyFactory、Linux 的 pam_pbkdf2 插件可用
Linux 系统级升级:三步缺一不可
改 PAM 配置:编辑 /etc/pam.d/passwd,确保有且仅有一行生效:
password required pam_unix.so sha512 shadow nullok rounds=65536
设全局默认:修改 /etc/default/passwd,加入或修正:
CRYPT=sha512
强制重设密码:配置只影响后续修改,已有用户需主动执行 passwd;管理员可批量触发:
-
sudo chage -d 0 username(下次登录强制改密) - 验证方式:
sudo grep "^$USER:" /etc/shadow | cut -d: -f2,输出以$6$开头即为 SHA-512 生效
应用层迁移:平滑过渡不中断服务
不要全量替换旧哈希——用户不登录,旧数据永远不动。正确做法是“懒迁移”:
- 登录时用
password_verify()(PHP)或BCrypt.checkpw()(Java)校验;若返回 false 但旧格式匹配,说明是老哈希,立即用新算法重哈希并更新数据库 - 提供后台迁移脚本:如 Serverpod 的
Emails.migrateLegacyPasswordHashes(),幂等设计,可分批执行 - 监控日志中
password_needs_rehash()(PHP)或自定义标记字段,识别待升级账户
升级不是改一行配置就完事。关键是选对算法、配对参数、触发重哈希、验证结果。系统和应用双线推进,才能让每一条密码真正扛得住泄露和爆破。

















