深入解析Linux shadow文件中的SHA512密码哈希

本文详细解析了Linux系统中/etc/shadow文件使用的SHA512密码哈希机制,探讨了sha512crypt算法的实现原理,并提供了使用C语言、Perl和OpenSSL工具生成和验证密码哈希的实用方法。

理解/etc/shadow中的SHA512哈希

在RHEL-8.10系统中,当/etc/login.defs配置了ENCRYPT_METHOD SHA512时,为本地ron账户设置密码后,在/etc/shadow文件中会出现如下条目:

1
ron:$6$NbmOz0kL4eKjJbwi$JE1.19BxJWh7cbZjmPPDrviuBV7l7h/Jlqz56CVqXmpttsXbz3YjhQ9Qm0CiYAY8oG4jkatTqXVgiAfbU66rR1:20377:0:99999:14:::

哈希不匹配的原因

当尝试使用在线工具(如randommer.io)复制此哈希时,输入密码"ron"和盐值"NbmOz0kL4eKjJbwi"后,得到的结果是:

1
FD1C072B6D4578F30D5615F189D9317D8E24CAC2D60C0A6D280636C9035ED12A8C64F2C9F4D542C6BC4750373C6BA88745D2159428F04BB5FE068285F4B41D08

这种差异主要由两个原因造成:

  1. 编码格式不同/etc/shadow文件使用Base64编码,而在线工具返回十六进制格式
  2. 算法差异:shadow文件中的哈希不是普通的SHA512,而是sha512crypt算法

sha512crypt算法详解

sha512crypt不是简单的SHA512哈希,而是多次迭代SHA512的专用算法,旨在抵抗暴力破解攻击。其原理类似于PBKDF2-SHA512。

正确生成哈希的方法

使用C语言

1
2
3
4
5
6
7
8
// 编译时添加 -lcrypt 参数
#include <crypt.h>
#include <stdio.h>

void main()
{
  printf("%s\n",crypt("ron","$6$NbmOz0kL4eKjJbwi"));
}

输出结果与shadow文件中的哈希完全一致。

使用Perl

1
print crypt('ron','$6$NbmOz0kL4eKjJbwi')

使用OpenSSL命令行工具

1
printf %s ron | openssl passwd -6 -salt NbmOz0kL4eKjJbwi -stdin

修改迭代次数

可以通过指定轮数来修改哈希计算的强度:

1
printf %s ron | openssl passwd -6 -salt 'rounds=99999$NbmOz0kL4eKjJbwi' -stdin

安全注意事项

虽然手动验证哈希有助于理解密码存储机制,但在实际应用中应使用PAM(可插拔认证模块)进行密码验证操作。直接操作shadow文件可能存在安全风险。

sha512crypt算法相比普通SHA512提供了更好的安全性,但现代系统更推荐使用Bcrypt($2b$)或Yescrypt($y$)等更强的哈希算法。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计