直接改/etc/login.defs的ENCRYPT_METHOD为SHA512仅是基础配置,必须同步更新PAM中pam_unix.so行(含sha512 shadow参数)并令所有用户重设密码,最终以/etc/shadow中哈希前缀为$6$为准验证生效。

直接改 /etc/login.defs 中的 ENCRYPT_METHOD 行即可,但必须配合 PAM 配置与密码重设,否则不生效。
确认当前算法再动手
别凭印象判断,先查真实状态:
- 运行
grep "^ENCRYPT_METHOD" /etc/login.defs—— 若输出是ENCRYPT_METHOD MD5或SHA256,说明还没升级 - 检查
/etc/shadow里某个刚改过密码的用户(比如自己):sudo grep "^$(whoami):" /etc/shadow | cut -d: -f2,开头是$1$(MD5)、$5$(SHA-256)还是$6$(SHA-512)或$y$(yescrypt) - yescrypt 在较新系统(如 Debian 12+/Ubuntu 22.04+、RHEL 9+)才原生支持,老系统即使写
ENCRYPT_METHOD YESCRYPT也会静默回退
修改 login.defs 启用 SHA512
编辑文件:sudo nano /etc/login.defs
- 找到
ENCRYPT_METHOD行,改为:ENCRYPT_METHOD SHA512 - 确保该行未被注释(开头不能有
#) - 保存退出。这一步只影响后续新建用户和
passwd命令的行为,不影响已有密码哈希
同步更新 PAM 配置(关键!)
/etc/login.defs 是“声明”,PAM 才是“执行者”。缺它,ENCRYPT_METHOD 形同虚设。
-
Debian/Ubuntu:编辑
/etc/pam.d/common-password,找到含pam_unix.so的 password 行,确保它包含:sha512 shadow nullok rounds=65536 -
RHEL/CentOS 8+:推荐用
authselect select sssd with-sha512 --force,它会自动配置 PAM 和 login.defs -
所有系统都必须检查/etc/pam.d/passwd
:里面那条pam_unix.so行也得是sha512 shadow nullok rounds=65536,否则passwd命令仍走旧算法
yescrypt 的特别处理
yescrypt 比 SHA512 更抗 GPU 破解,但支持依赖 glibc 版本(≥ 2.35)和发行版适配:
- 确认系统支持:
getconf GNU_LIBC_VERSION输出应为glibc 2.35或更高 - 在
/etc/login.defs中设:ENCRYPT_METHOD YESCRYPT - PAM 行必须写
yescrypt而非sha512,例如:password required pam_unix.so yescrypt shadow nullok rounds=65536 - 注意:
rounds=65536对 yescrypt 仍有效,但实际迭代强度还受memcost(内存消耗)参数影响;默认值通常已足够,一般无需额外调优
必须让所有用户重设一次密码
这是最容易被跳过的一步,也是唯一让哈希真正更新的方式:
- 普通用户登录后运行
passwd,按提示输入旧密码、设新密码 - 管理员为他人操作:
sudo passwd username - 服务账户(如
www-data、postgres)也要覆盖:sudo passwd www-data(可设为空密码或随机串,只要触发哈希重算) - root 用户同样要执行
sudo passwd root,否则/etc/shadow里 root 的哈希仍是旧的
验证是否真正生效
改完配置≠升级完成。最终验证只看 /etc/shadow:
- 改密后立刻执行:
sudo grep "^$(whoami):" /etc/shadow | cut -d: -f2 - 结果以
$6$开头 → SHA512 成功 - 结果以
$y$开头 → yescrypt 成功 - 仍是
$1$或$5$→ 某个环节漏了:大概率是 PAM 没改对、/etc/pam.d/passwd被忽略,或用户根本没重设密码


















