驗證 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。 (即使您啟用了自動登錄,關閉對話方塊也可能會要求以其他使用者身分登入。)

相關內容