bash スクリプトでパスワードハッシュを検証しますか?

bash スクリプトでパスワードハッシュを検証しますか?

関連Linux Mint のルート パスワードがユーザー パスワードになるのはなぜですか?

私の Mint 17.3 ボックスにはルート パスワードが設定されているようです: にパスワード ハッシュが表示されます/etc/shadow( で始まります$6$...)。このパスワード ハッシュを (既知の) ユーザー パスワードと比較したいと思います。

何らかの理由で、私はsu -(リンクされた質問で)使用しないことを信頼していません私のパスワード、対パスワード。

既知のハッシュと既知のパスワードを比較し、一致するかどうかを確認する簡単な方法(bash など)はありますか?

答え1

で使用されている塩を見つけてください/etc/shadow。それは 2 番目と 3 番目の文字の間にあり$、通常は 8 個あります。

を使用しmkpasswd -m sha-512 -S <salt>、尋ねられたら、想定されるパスワードを入力します。$6$<salt>$プレフィックスが付いたハッシュが出力されます。

答え2

最終的には、パスワードを最初の引数として、ハッシュ ( ) を 2 番目の引数として、 (Linux Mint などの GNU システムでは GNU libc に付属)crypt(3)から関数を呼び出す必要があります。libcrypt$6$...

pythonは、その機能を公開するツールの 1 つであり、次の操作を実行できます。

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()関数を呼び出す別の方法 ( は標準モジュールの 1 つであるため、そうする必要はありませんが、以前はモジュールに独自の個別の実装が付属しているcryptという印象を持っていました) は次のようになります。cryptcrypt()

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ます。(自動ログインが有効になっている場合でも、シャットダウン ダイアログで別のユーザーとしてログインするように提案される場合があります。)

関連情報