mkpasswd の SHA512 ソルトハッシュがオンラインバージョンと一致しません

mkpasswd の SHA512 ソルトハッシュがオンラインバージョンと一致しません

Linux (Ubuntu) /etc/shadow に保存されているハッシュ (ASCII) コードに困惑しています。

仮にパスワードを'テスト'、塩は「ゼム197T4」

次のコマンドを実行すると、

$ mkpasswd -m SHA-512 test Zem197T4

長い一連の ASCII 文字が生成されます (これは実際に Linux が /etc/shadow に保存する方法です)

$6$Zem197T4$oCUr0iMuvRJnMqk3FFi72KWuLAcKU.ydjfMvuXAHgpzNtijJFrGv80tifR1ySJWsb4sdPJqxzCLwUFkX6FKVZ0

オンラインSHA-512ジェネレータ(例:http://www.insidepro.com/hashes.php?lang=eng) の場合、生成されるのは以下の 16 進コードです。

オプション1) パスワード+ソルト

8d4b73598280019ef818e44eb4493c661b871bf758663d52907c762f649fe3355f698ccabb3b0c59e44f1f6db06ef4690c16a2682382617c6121925082613fe2

オプション2) ソルト+パスワード

b0197333c018b3b26856473296fcb8637c4f58ab7f4ee2d6868919162fa6a61c8ba93824019aa158e62ccf611c829026b168fc4bf90b2e6b63c0f617198006c2

これらの 16 進コードは、mkpasswd によって生成される ASCII コードと同じものであるはずです。しかし、それらはどのように関連しているのでしょうか?

誰かが私に教えてくれるといいのですが?

答え1

Ubuntu/Debianではmkpasswdパッケージの一部です誰がそして、実際には glibc で宣言されている関数mkpasswd.cの洗練されたラッパーとして実装されています。crypt() は、パスワードとソルトの 2 つの引数を取ります。この場合、パスワードは「test」で、ソルトには SHA-512 ハッシュの「$6$」が先頭に付加されます (crypt()unistd.hSHA 暗号化) なので、"$6$Zem197T4" が crypt() に渡されます。

-Rラウンド数を決定するオプションに気づいたかもしれませんmkpasswd。ドキュメントには、5000 ラウンドのデフォルトが記載されています。これが、結果が salt とパスワードの単純な連結と決して等しくならない最初のヒントです。ハッシュは 1 回だけではないからです。実際には、パスすると-R 5000同じ結果が得られます。この場合、"$6$rounds=5000$Zem197T4" が crypt() に渡され、glibc (Debian/Ubuntu の libc) の実装は、ここからメソッドとラウンド数を抽出します。

crypt() 内部で行われる処理は、単一のハッシュを計算するよりも複雑で、結果は最終的に base64 でエンコードされます。そのため、あなたが示した結果には、SHA-512 ハッシュの一般的な 16 進文字列のように [0-9a-f] だけでなく、最後の '$' の後にあらゆる種類の文字が含まれています。アルゴリズムについては、すでに述べたSHA 暗号書類。

答え2

ソルト付きパスワードを使用する主な目的は、同じパスワードのハッシュを生成するたびに異なる結果が得られることです。これは、レインボー テーブルの問題を回避するためです。

ユーザーの 1 人が弱いパスワード (たとえば 123456) を使用したとします。その場合、/etc/shadow が露出します。この場合、悪意のあるハッカーはレインボー テーブルを使用して弱いパスワードを解明し、それを他の場所で再度使用するだけです。

関連情報