上一篇
Linux密码怎样加密存储?
- Linux
- 2025-06-29
- 4
Linux密码通过哈希算法(如SHA-512)加密,并加入随机盐值(salt)增强安全性,加密后的哈希值存储在 /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:盐值+密码的哈希计算结果
- id:算法标识符
密码加密过程
当用户设置密码时,系统执行以下操作:

- 生成随机盐值(salt)(如 sA1d8GgT)
- 将盐值与用户输入的密码拼接(如密码 123 → sA1d8gT123)
- 使用指定算法(如SHA-512)计算哈希值
- 存储为 $6$sA1d8GgT$Fv5J... 格式
关键特性:
- 相同密码每次加密结果不同(盐值随机)
- 哈希不可逆(无法通过 Fv5J... 还原 123)
- 验证时:用存储的盐值重新计算输入密码的哈希,比对结果
配置与算法升级
-
查看当前加密算法
执行命令:
-
修改默认算法(需root权限)
- 方法1:编辑 /etc/login.defs ENCRYPT_METHOD SHA512 # 改为 YESCRYPT 或 SHA256
- 方法2:使用 authselect(现代系统推荐): authselect select sssd with-sha512 --force # 示例
-
手动生成加密密码
使用 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(部分发行版支持)
- 加密算法规范:NIST SP 800-63B (数字身份指南)
- Linux实现:GNU C Library (glibc) 的 crypt() 函数
- 最新算法:Yescrypt 被纳入 Linux PAM 作为默认(2020年后主流发行版)
- 安全建议:遵循OWASP密码存储备忘单(2025)
- Linux Programmer’s Manual – crypt(3)
- NIST Special Publication 800-63B
- OWASP Password Storage Cheat Sheet
- shadow(5) man page (文件格式定义)
安全最佳实践
常见问题解答
Q:Root能否查看用户密码?
→ 不能!仅能重置密码(passwd 用户名),无法获取原始密码。
Q:为何/etc/passwd中密码显示为x?
→ 历史遗留设计,x 表示实际密码存储在 /etc/shadow 中。
Q:企业环境如何管理?
→ 集成 LDAP 或 RADIUS 认证,避免本地密码存储。
技术依据与标准
️ 重要提醒:加密≠绝对安全!需配合长密码、多因素认证(MFA)及系统加固。
通过以上机制,Linux实现了密码的安全存储,系统管理员应持续关注算法演进(如量子计算威胁),及时升级防护体系。
引用来源:
