确认密码哈希算法应直接查authconfig --test或/etc/login.defs的encrypt_method字段;rhel系用authconfig --passalgo=sha512 --update,debian/ubuntu改/etc/pam.d/common-password中pam_unix.so行;升级后需重设密码才能生效,验证以/etc/shadow第二字段是否为$6$开头为准。

如何确认当前系统密码哈希算法
直接查 authconfig --test 或看 /etc/login.defs 里的 ENCRYPT_METHOD 字段,比猜靠谱得多。很多老系统默认还是 MD5,哪怕 shadow 里看到 $6$ 开头的哈希,也不代表新用户会自动用 SHA-512——那可能是某个用户自己改过密码留下的痕迹。
-
authconfig --test | grep hashing输出password hashing algorithm is md5→ 确实没升级 -
grep "^ENCRYPT_METHOD" /etc/login.defs返回空或ENCRYPT_METHOD MD5→ 同样需要配置 - Ubuntu/Debian 系统不用
authconfig,得查/etc/pam.d/common-password中pam_unix.so行是否含sha512
执行升级:authconfig vs login.defs 二选一
Red Hat/CentOS/Alpine 等基于 RHEL 血统的系统,优先用 authconfig;Debian/Ubuntu 则必须改 PAM 配置。混用会导致行为不一致,比如 authconfig 设了 sha512,但 /etc/pam.d/passwd 还是 md5,新密码仍生成 MD5 哈希。
- RHEL系:
authconfig --passalgo=sha512 --update(注意大小写,SHA512会失败) - Debian/Ubuntu:编辑
/etc/pam.d/common-password,把pam_unix.so行中的md5换成sha512,并加上rounds=65536提升强度 - 所有发行版都需同步检查
/etc/login.defs,确保ENCRYPT_METHOD SHA512存在且未被注释
为什么改完不生效?关键在“密码重设”这一步
升级算法只是改了“未来密码怎么存”,不会批量重算已有哈希。也就是说,root 用户不主动改一次密码,/etc/shadow 第二字段依然保持旧格式(如 $1$... 或空),登录时系统仍按老规则校验。
- 强制用户下次登录改密码:
chage -d 0 username(包括root) - 临时测试可手动用
openssl passwd -6或python3 -c "import crypt; print(crypt.crypt('pw', crypt.mksalt(crypt.METHOD_SHA512)))"生成一个$6$哈希,替换/etc/shadow对应字段(仅限测试环境!) - 别漏掉服务账户(如
www-data,postgres),它们若长期不登录,哈希就永远不更新
验证是否真用了 SHA-512:别只信配置文件
最稳的验证方式,是自己改一次密码,然后立刻检查 /etc/shadow 对应行第二字段是否以 $6$ 开头。光看 authconfig --test 输出或 PAM 配置,无法排除拼写错误、权限问题或某条 PAM 规则被跳过。
- 改密码后执行:
sudo grep "^$(whoami):" /etc/shadow | cut -d: -f2 - 输出类似
$6$abc123$xyz...→ 成功;仍是$1$...或$5$...→ 某处配置未生效 - 注意:某些容器环境或最小化安装可能没装
authconfig,报command not found时别硬试,直接切 PAM 方式
authconfig 和 PAM 的优先级、路径、参数名全都不一样,得盯住实际生成的哈希值,而不是配置文件里写了什么。










