/etc/shadow 内のハッシュはどのように生成されますか?

/etc/shadow 内のハッシュはどのように生成されますか?

私は読んでいたウィキペディアの記事shadow ファイルには、行の形式は次のようになっていると記載されています。

$id$salt$hashed

それで、私の質問は、それがどのように機能するかということです。

パスワードを持っている自分のアカウントのハッシュを計算しようとしたので、次のコマンドを使用しました。

sha512sum {ソルト}+{私のクリアテキストパスワード}

しかし、出力は私が見たハッシュとは異なります。それで、どのように動作するのでしょうか? 何が足りないのでしょうか?

答え1

考慮すべき点がいくつかあります (確認するには Linux coreutils と glibc2 のソースを読む必要があります)

  • sha512sum の出力は印刷可能な 16 進表記のように見えますが、shadow ファイルに保存されている出力は base64 のように見えるため、それらは異なります。

  • シャドウ ファイル内の sha512sum はハッシュ関数を複数回通過していると思います ( #define ROUNDS_DEFAULT 5000)。一方、sha512sum は「ファイル」をハッシュに 1 回だけ通過させます。

  • データを揃えるために、一方または両方のコマンドによってパディングが追加されることがあります。パディングは異なる場合があります。

答え2

ファイルに保存されているのと同じ方法でハッシュを作成する場合は/etc/shadow、次のコマンドを使用します。

mkpasswd --method=sha-512 --salt=YOUR_SALT PASSWORD

答え3

からshadow(5)マニュアルページ:

暗号化されたパスワード

参照する地下室この文字列がどのように解釈されるかについては、(3) を参照してください。

パスワードフィールドに有効な結果ではない文字列が含まれている場合地下室(3)例えば、!や*の場合、ユーザーはUNIXパスワードを使用してログインすることはできません(ただし、ユーザーは他の方法でシステムにログインできます)。

このフィールドは空でも構いません。その場合、指定されたログイン名として認証するためにパスワードは必要ありません。ただし、/etc/shadow ファイルを読み取る一部のアプリケーションでは、パスワード フィールドが空の場合、アクセスを一切許可しないことがあります。

感嘆符で始まるパスワード フィールドは、パスワードがロックされていることを意味します。行の残りの文字は、パスワードがロックされる前のパスワード フィールドを表します。

からcrypt(3)マニュアルページ:

crypt() はパスワード暗号化関数です。これは、データ暗号化標準アルゴリズムに基づいていますが、そのバリエーションは、(特に) akey 検索のハードウェア実装の使用を阻止することを目的としています。

キーはユーザーが入力したパスワードです。

salt は [a–zA–Z0–9./] のセットから選択された 2 文字の文字列です。この文字列は、4096 通りの方法のうちの 1 つでアルゴリズムを混乱させるために使用されます。

キーの最初の 8 文字のそれぞれの最下位 7 ビットを取得することで、56 ビットのキーが取得されます。この 56 ビットのキーは、定数文字列 (通常はすべてゼロで構成される文字列) を繰り返し暗号化するために使用されます。戻り値は、暗号化されたパスワード、つまり 13 個の印刷可能な ASCII 文字の連続を指します (最初の 2 文字は salt 自体を表します)。戻り値は、各呼び出しによって内容が上書きされる静的データを指します。

関連情報