在linux系统中,用户密码的存储并非集中在单个文件里,而是和用户信息、加密密码分别存放在两个不同文件中,这种设计是出于安全层面的考量。

用户密码相关的两个核心文件
1. /etc/passwd 文件
这个文件主要存储用户的基本信息,早期linux曾把加密后的密码放在该文件的第二个字段,但现在该字段通常显示为x,仅作为占位符存在。该文件对所有用户都有读取权限,内容格式如下:
每一行代表一个用户,字段之间用冒号分隔,格式为:用户名:密码占位符:用户ID:组ID:用户描述:家目录:登录shell
我们可以通过以下命令查看passwd文件的内容:
# 查看前5行passwd文件内容 head -5 /etc/passwd # 输出示例(不同系统略有差异): # root:x:0:0:root:/root:/bin/bash # daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin # bin:x:2:2:bin:/bin:/usr/sbin/nologin # sys:x:3:3:sys:/dev:/usr/sbin/nologin # sync:x:4:4:sync:/bin:/bin/sync
2. /etc/shadow 文件
这个文件才是真正存储用户加密密码的地方,只有root用户和shadow组的用户才有读取权限,普通用户无法访问,大大提升了密码的安全性。该文件同样每行对应一个用户,字段用冒号分隔,核心格式为:
用户名:加密密码:最后修改时间:最小修改间隔:密码有效期:警告天数:失效宽限天数:失效时间:保留字段
其中第二个字段就是加密后的密码,如果字段开头是!或者*,表示该用户被锁定,无法登录。查看shadow文件需要root权限:
# 切换到root用户后查看shadow文件前5行 sudo head -5 /etc/shadow # 输出示例(密码部分为加密后的字符串): # root:$6$abcd1234$xxxx...:19400:0:99999:7::: # daemon:*:19389:0:99999:7::: # bin:*:19389:0:99999:7::: # sys:*:19389:0:99999:7::: # sync:*:19389:0:99999:7:::
为什么密码不直接存在passwd文件
passwd文件对所有用户开放读取权限,如果加密密码直接存放在这里,普通用户可以通过读取该文件获取加密后的密码字符串,再通过暴力破解的方式尝试获取明文密码。而shadow文件只有root权限可访问,避免了普通用户接触加密密码字符串,大幅降低了密码泄露的风险。
常见相关操作说明
- 修改用户密码时,系统会自动更新shadow文件中对应用户的加密密码字段
- 锁定用户可以通过在shadow文件的密码字段前添加!实现,比如
usermod -L 用户名命令就是执行这个操作 - 查看密码相关配置时,不要直接修改shadow文件,建议通过
passwd、chage等专用命令操作,避免格式错误导致用户无法登录
密码加密方式说明
shadow文件中的加密密码字段开头会标识加密算法,比如$6$代表SHA-512算法,$5$代表SHA-256算法,$1$代表MD5算法,后面跟着salt值和加密后的结果。示例中的$6$abcd1234$xxxx...就表示使用SHA-512算法,salt值为abcd1234。
注意:不要随意修改shadow文件的权限,否则可能导致系统用户认证失败,所有用户都无法登录系统。
linuxshadow_filepasswd_fileuser_password修改时间:2026-06-27 06:48:27