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.h
SHA 暗号化) なので、"$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 が露出します。この場合、悪意のあるハッカーはレインボー テーブルを使用して弱いパスワードを解明し、それを他の場所で再度使用するだけです。