Проверить хеш пароля в скрипте bash?

Проверить хеш пароля в скрипте bash?

Относится кПочему пароль root в Linux Mint является моим паролем пользователя?

Похоже, что на моем компьютере с Mint 17.3 установлен пароль root: я вижу хэш пароля в /etc/shadow(он начинается с $6$...). Я хотел бы сравнить этот хэш пароля с моим (известным) паролем пользователя.

По какой-то причине я не верю su -(в связанном вопросе), что не следует использоватьмойпароль, противкореньпароль.

Есть ли простой способ (например, в bash) сравнить известный хеш с известным паролем и посмотреть, совпадают ли они?

решение1

Найдите соль, используемую в /etc/shadow, это символы между вторым и третьим $, обычно их восемь.

Используйте mkpasswd -m sha-512 -S <salt>, и введите пароль, который, по вашему мнению, должен быть, когда он спросит. Он выведет хэш с $6$<salt>$префиксом.

решение2

В конце концов, вам нужно вызвать crypt(3)функцию из libcrypt(которая в системах GNU, таких как Linux Mint, поставляется с GNU libc) с паролем в качестве первого аргумента и хешем ( $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 и/или установить пару ключей; или войти в систему на вашем обычном графическом экране входа в качестве пользователя root. (Даже если у вас включен автоматический вход, диалоговое окно завершения работы может предложить войти в систему как другой пользователь.)

Связанный контент