6

PHP でのパスワード セキュリティについて調べていたところ、興味深いステートメントを見つけました。

ソルトとしてパスワードをそのハッシュでハッシュすると、同じハッシュが返されます

あまり考えずにphp.netにアクセスしたところ、同じことを言っていることがわかりました。

例を見てみましょう:

crypt("test", "test"); -> teH0wLIpW0gyQ
crypt("test", "teH0wLIpW0gyQ"); -> teH0wLIpW0gyQ

PHP の crypt が、指定された文字列の一方向ハッシュを生成することは完全に理解できます。

  1. 私が理解できないのは、2 つのまったく異なるソルトを使用して同じハッシュ出力を取得する方法です。
  2. 同じハッシュを与える可能性のある他のソルトが存在する可能性があるということですか?

ファローアップ

ご指摘いただきありがとうございます。デフォルトの動作はソルトの最初の 2 文字のみを使用することであることがわかりました。これにより、すべての質問に完全に答えることができます。ばかげたような気がしますが...

4

2 に答える 2

5

これは意図的に行われます。crypt 関数は、2 番目の引数が文字と数字で構成される場合、暗号化に "salt" の最初の 2 文字のみを使用し、これらの 2 文字は結果の先頭に配置されます。そう、

crypt("test", "test");        -> teH0wLIpW0gyQ
crypt("test", "te");          -> teH0wLIpW0gyQ
crypt("test", "tea");         -> teH0wLIpW0gyQ
crypt("test", "temperature"); -> teH0wLIpW0gyQ
etc.

これは、パスワードの正確性を簡単に確認するために行われるため、
crypt($password, crypt($password, $salt)) == crypt($password, $salt)

于 2013-11-09T21:23:00.950 に答える
3

1‍. 私が理解できないのは、2 つのまったく異なるソルトを使用して同じハッシュ出力を取得する方法です。

関数に異なるソルトを指定しましたが、crypt内部で同じソルトを使用しteます。これは、crypt実装方法によるものです。

アルファベット "./0-9A-Za-z" の 2 文字のソルトを使用した標準の DES ベースのハッシュ。

そのため、2 文字を超えるソルトを指定しても、最初の 2 文字しかかかりません。

crypt出力には、計算されたハッシュの前に使用されたソルトが含まれているため、cryptハッシュをソルトとして使用すると、まったく同じ出力が得られます。保存されたパスワードを確認するために以下を使用できるため、これは完璧です。

crypt($password, $hash) === $hash


2‍. 同じハッシュを与える可能性のある他のソルトが存在する可能性があるということですか?

はい。これは、 bcryptcryptなどの他のアルゴリズムにも当てはまります。

于 2013-11-09T21:27:18.473 に答える