0

PHP バージョン 5.2.10 でシステムを実行しています。 残念ながら、元のプログラマーは crypt() の実装方法を誤解していました。

$crypt = crypt(trim($cuPassword), CRYPT_BLOWFISH); 
// The programmer thought this is how you configure a blowfish cipher

nb CRYPT_BLOWFISH の値は、このマシンではゼロです。

これは、0$oZ534I2VvSw などのランダムに見えるパスワード ハッシュを生成するのと同じように機能します。

今日、ソフトウェアを PHP 5.4.9 に移行したところ、 $crypt が *0 、つまり無効なソルトによるエラーになることがわかりました。

私の問題は、検証できないログイン パスワードのテーブルがあることです。私の質問: バージョン 5.2 で実行されていた元の暗号を再現する方法はありますか? 「0」をソルトとして渡したときに実装されたハッシュは何ですか?

4

4 に答える 4

1

有効な 2 桁の組み合わせ (CRYPT_STD_DES) をすべて試したところ、「0q」が (ほぼ) 同等であることがわかりました。

PHP 5.2.10 crypt(trim($cuPassword), CRYPT_BLOWFISH);

結果 = 0$txv6CWBxJ9Y

PHP 5.4.9 crypt(trim($cuPassword), '0q');

結果 = 0qtxv6CWBxJ9Y

2 番目の文字を調整するだけで、もう一度パスワードを照合できます。

于 2013-07-10T12:57:18.243 に答える
1

あなたの説明は実際には当てはまりません。PHP 5.4.9 では、これをテストしました。

var_dump(crypt('hello', 0));

出力:

0$ny0efnQXFkE

PHP 5.5 では*0crypt('hello', 0). でも大丈夫!これは PHP 5.5 にも当てはまります: this crypt('hello', '0$ny0efnQXFkE') == '0$ny0efnQXFkE'.

新しいパスワードのハッシュの生成方法を変更するだけです。既存のパスワードの検証は引き続き機能します。

適切な対策として、ユーザーが正常にログインした後、ハッシュが で始まっているかどうかを確認してください0$。存在する場合は、更新された適切な crypt 呼び出しを使用して、パスワードを再ハッシュします (パスワードを入力したので、それが何であるかがわかります)。

于 2013-07-10T01:23:23.393 に答える
0

"$" は crypt(3) によると有効なソルト値ではないため、以前の PHP/libc と同じように壊れている crypt 実装を見つける必要があります :)

古いパスワードを確認するだけで十分な場合は、Matthews の回答を使用してください。それ以外の場合は、現在まだ "0$" をソルトとして受け入れているように見える openssl を試してください。

$ echo -n "secret" | openssl passwd -crypt -salt '0$' -stdin
0$z.PXBBy6uY.
于 2013-07-10T23:08:04.200 に答える
0

いいえ、元の暗号を再現する方法はありません。そうしないとボーイスカウトでもフグを折ることができる。

ユーザーのパスワードをランダムに生成してもう一度ハッシュし、ログインしたらすぐにパスワードを変更するよう強制するのが最善の方法です。

于 2013-07-10T01:04:54.187 に答える