「openssl passwd」の出力が毎回異なる理由は何ですか?

「openssl passwd」の出力が毎回異なる理由は何ですか?

openssl passwdコマンドは、実行時に入力されたパスワードまたはリスト内の各パスワードのハッシュを計算します。パスワードリストは、-inオプションで指定されたファイル、-stdinオプションで標準入力から、そうでない場合はコマンドラインから取得されます。 UNIX標準アルゴリズムcryptとMD5ベースのBSD暗号化アルゴリズム1と対応するApacheバリアントapr1の両方を使用できます。

私は「ハッシュ」という言葉が「を意味する」と理解しています。入力を元の入力を導出することが困難または不可能な出力に変換より具体的には、ハッシュされた入力:出力関係はN:Mです。ここで M <= N(つまり、ハッシュ衝突が可能です)。

openssl passwd同じ入力で ""を連続して実行すると、出力が異なるのはなぜですか?

> openssl passwd
Password:
Verifying - Password:
ZTGgaZkFnC6Pg
> openssl passwd
Password:
Verifying - Password:
wCfi4i2Bnj3FU
> openssl passwd -1 "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/
> openssl passwd -1 "a"
$1$JhSBpnWc$oiu2qHyr5p.ir0NrseQes1

この関数は実行中のように見えるため、この関数の目的を理解できません。同じ入力に同じハッシュアルゴリズムを使用すると、複数の固有の出力が生成されます。。 M>Nのように見えるN:M入力:出力関係のため混乱しているようです。

ベストアンサー1

> openssl passwd -1 "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/

これは、拡張Unixスタイルのパスワードcrypt(3)ハッシュ構文、特にMD5バージョンです。

最初の部分は$1$ハッシュタイプを識別し、次の部分OKgLCmVlはパスワードを暗号化するために使用されるソルトであり、区切り文字の次の行の$終わりまでは実際のパスワードハッシュです。

したがって、最初の暗号化からソルト部分を取得し、後続の暗号化に使用すると、常に同じ結果が得られます。

> openssl passwd -1 -salt "OKgLCmVl" "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/
> openssl passwd -1 -salt "OKgLCmVl" "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/

あなたがいるときパスワード変更、常に新しい塩に変えなければなりません。これにより、新しいパスワードが実際に古いパスワードと同じであるかどうか、後で他の人が見つけることを防ぐことができます。 (以前のパスワードの再利用を防ぐために、もちろん新しいパスワード候補を2回ハッシュすることができます。一度は古いパスワードで、その後は結果が古いパスワードとは異なり、許可されている場合は新しいパスワードソルトに再ハッシュします。)

オプションを使用しない場合は、dave_thompson_085で説明されているように元の互換openssl passwdハッシュcrypt(3)を取得します。これにより、塩はハッシュの最初の2文字です。

> openssl passwd "a"
imM.Fa8z1RS.k
> openssl passwd -salt "im" "a"
imM.Fa8z1RS.k

新しい実装では、この古いハッシュスタイルを使用しないでください。有効なパスワードの長さを8文字に制限し、ソルトが少なすぎて現代的な方法から適切に保護できないからです。

(クラシックハッシュごとにレインボーテーブルセット全体を保存するのに必要なデータ量を計算したことがありますcrypt(3)。考えには、これは「組織的な犯罪者がこれを行うことができます」の範囲内にあると思います。)

おすすめ記事