/etc/shadow
文件中,验证时系统使用相同盐值重新计算哈希进行比对。在Linux系统中,用户密码的安全性依赖于单向加密存储机制——系统存储的是密码的加密哈希值而非明文,且无法逆向解密,以下是详细技术原理和实践:
核心加密机制
-
存储位置
加密后的密码存储在/etc/shadow
文件中(仅root可读),格式为:用户名:加密字符串:最后修改日期:最小天数:最大天数:警告期:失效期:保留字段
john:$6$sA1d8GgT$Fv5J...:19200:0:99999:7:::
-
加密字符串结构
以$id$salt$hashed
格式存储,包含三个关键部分:id
:算法标识符$1$
→ MD5 (已淘汰)$5$
→ SHA-256$6$
→ SHA-512(当前主流)$y$
→ Yescrypt(最新默认算法,如Ubuntu 22.04+)
salt
:随机盐值(12-16字符),防止彩虹表攻击hashed
:盐值+密码的哈希计算结果
密码加密过程
当用户设置密码时,系统执行以下操作:
- 生成随机盐值(salt)(如
sA1d8GgT
) - 将盐值与用户输入的密码拼接(如密码
123
→sA1d8gT123
) - 使用指定算法(如SHA-512)计算哈希值
- 存储为
$6$sA1d8GgT$Fv5J...
格式
✅ 关键特性:
- 相同密码每次加密结果不同(盐值随机)
- 哈希不可逆(无法通过
Fv5J...
还原123
)- 验证时:用存储的盐值重新计算输入密码的哈希,比对结果
配置与算法升级
-
查看当前加密算法
执行命令:authselect current | grep "Password hashing" # 或检查 /etc/login.defs 中的 ENCRYPT_METHOD 值
-
修改默认算法(需root权限)
- 方法1:编辑
/etc/login.defs
ENCRYPT_METHOD SHA512 # 改为 YESCRYPT 或 SHA256
- 方法2:使用
authselect
(现代系统推荐):authselect select sssd with-sha512 --force # 示例
- 方法1:编辑
-
手动生成加密密码
使用openssl
或mkpasswd
:openssl passwd -6 -salt "随机盐值" 你的密码 # 或 mkpasswd -m sha-512 -S 盐值 密码
安全最佳实践
-
强制强密码策略
- 安装
libpam-pwquality
:sudo apt install libpam-pwquality
- 编辑
/etc/security/pwquality.conf
配置最小长度、复杂度等
- 安装
-
防范暴力破解
- 使用 fail2ban 监控登录尝试
- 限制
/etc/shadow
权限为640
(root:shadow)
-
定期更新算法
淘汰弱算法(如MD5),优先选择:- Yescrypt(抗GPU/ASIC破解)
- Argon2(部分发行版支持)
常见问题解答
❓Q:Root能否查看用户密码?
→ 不能!仅能重置密码(passwd 用户名
),无法获取原始密码。
❓Q:为何/etc/passwd中密码显示为x
?
→ 历史遗留设计,x
表示实际密码存储在 /etc/shadow
中。
❓Q:企业环境如何管理?
→ 集成 LDAP 或 RADIUS 认证,避免本地密码存储。
技术依据与标准
- 加密算法规范:NIST SP 800-63B (数字身份指南)
- Linux实现:GNU C Library (
glibc
) 的crypt()
函数 - 最新算法:Yescrypt 被纳入 Linux PAM 作为默认(2020年后主流发行版)
- 安全建议:遵循OWASP密码存储备忘单(2025)
⚠️ 重要提醒:加密≠绝对安全!需配合长密码、多因素认证(MFA)及系统加固。
通过以上机制,Linux实现了密码的安全存储,系统管理员应持续关注算法演进(如量子计算威胁),及时升级防护体系。
引用来源:
- Linux Programmer’s Manual –
crypt(3)
- NIST Special Publication 800-63B
- OWASP Password Storage Cheat Sheet
shadow(5)
man page (文件格式定义)
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/41489.html