验证 bash 脚本中的密码哈希?

验证 bash 脚本中的密码哈希?

相关为什么 Linux Mint 上的 root 密码是我的用户密码?

我的 Mint 17.3 盒子似乎设置了 root 密码:我看到密码哈希/etc/shadow(以 开头$6$...)。我想将此密码哈希与我的(已知)用户密码进行比较。

无论出于什么原因,我不相信su -(在链接的问题中)不使用我的密码,与密码。

有没有一种简单的方法(例如在 bash 中)将已知的哈希值与已知的密码进行比较并查看它们是否匹配?

答案1

找到 中使用的盐/etc/shadow,它是第二个和第三个之间的字符$,通常会有八个。

使用mkpasswd -m sha-512 -S <salt>,然后在询问时输入您认为应该使用的密码。它将输出带$6$<salt>$前缀的哈希值。

答案2

最后,您需要从(在 Linux Mint 等 GNU 系统上带有 GNU libc 的)调用该crypt(3)函数,并将密码作为第一个参数,将哈希值 ( ) 作为第二个参数。libcrypt$6$...

python是一个公开该功能的工具,因此您可以执行以下操作:

HASH='$6$...' python2 -c 'import crypt, os, getpass
print(crypt.crypt(getpass.getpass(), os.environ["HASH"]))'

如果输出与哈希值匹配,则密码正确。

$HASH上面可以是完整的散列(如$6$rounds=1234$somesalt$6eFBNhSgwEwdfZBHueBedpcqaVKGcV2DJy/tQMFd3JL88hwvgTkISJShnOUrbtP1fRs8I9rGIdsgWCoiujxD2/),也可以是最右边的部分$,即包括盐和可选的轮数($6$rounds=1234$somesalt$)。

或者您可以在以下位置进行验证python

HASH='$6$...' python2 -c '
import crypt, os, getpass
hash = os.environ["HASH"]
if crypt.crypt(getpass.getpass(), hash) == hash:
  print "OK"
else:
  print "Wrong password"'

(显然,$HASH必须包含完整的哈希值)。

通过python,您还可以使用该ctypes模块从任意库调用函数。因此,调用系统crypt()函数的另一种方法(不是您需要像crypt标准模块之一一样,只是我之前的印象是该crypt模块有自己单独的crypt()实现)是这样的:

HASH='$6$...' python2 -c '
from ctypes import *
import os, getpass
l = CDLL("libcrypt.so.1")
l.crypt.restype = c_char_p
print l.crypt(getpass.getpass(), os.environ["HASH"])'

答案3

ssh root@localhost我想到的是,尽管您的发行版可能完全禁用了 root 的基于密码的登录和/或安装了密钥对;或以 user 身份登录您常用的图形登录屏幕root。 (即使您启用了自动登录,关闭对话框也可能会要求以其他用户身份登录。)

相关内容