【发布时间】:2013-08-04 19:09:42
【问题描述】:
所以我的问题很简单,给定一个 linux 用户名和密码,我如何测试它是否是一个有效帐户?
【问题讨论】:
-
您尝试使用他们登录。如果你在,那么组合是有效的。
-
这里是一个C语言函数如何检查用户名和密码stackoverflow.com/a/63173069/2304760的例子
标签: linux hash passwords crypt
所以我的问题很简单,给定一个 linux 用户名和密码,我如何测试它是否是一个有效帐户?
【问题讨论】:
标签: linux hash passwords crypt
您可以使用影子文件验证给定用户名的给定密码是否正确。
在大多数现代发行版中,散列密码存储在影子文件 /etc/shadow 中(只有 root 才能读取)。以 root 身份,从给定用户的影子文件中提取该行,如下所示:
cat /etc/shadow | grep username
你会看到这样的:
username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::
用户名后面是 $1。这表明它是一个 MD5 散列。之后是另一个 $,然后(在这种情况下)TrOIigLp 后跟另一个 $。 TrOIigLp 是盐。之后是散列密码,使用盐进行散列 - 在本例中为 PUHL00kS5UY3CMVaiC0/g0。
现在,您可以使用 openssl 使用相同的盐对给定密码进行哈希处理,如下所示:
openssl passwd -1 -salt TrOIigLp
在提示时输入给定的密码,openssl 命令应该使用提供的 salt 计算 MD5 哈希,它应该与上述影子文件中的完全相同。上述命令中的 -1 用于 MD5 散列。
【讨论】:
getent shadow $user 更短……
openssl passwd -1 -salt TrOIigLp 中的 -1 代表 MD5 散列,如果我有 SHA-512 散列,是否可以使用 openssl 检查散列?我要改用另一个命令吗?
username:$6$
$6$ 表示 sha512 哈希。请参阅此answer 了解如何生成/检查哈希。
如果您担心安全性(您应该担心),则接受的答案表示将明文密码留在~/.bash_history 文件中会带来安全风险。考虑到这一点,最好尝试登录,或者从~/.bash_history 中删除此条目。
【讨论】:
~/.bash_history 中留下明文密码。但是,尝试登录似乎是更好的方法,因为您可能没有sudo 访问权限来阅读/etc/shadow。