9

ここでビー玉を失っていると思います... Web サイトに問題があり、ログインの受け入れがランダムに停止します。私は今、非常に奇妙な振る舞いをしている crypt() までたどることができました。

私のデータベースには、暗号化されたバージョンのユーザー パスワードがあります。Og12345678 としましょう。

ユーザーがログインすると、パスワードを入力し、データベースからソルトを読み取り、入力した内容を暗号化して比較します-通常、これは非常にうまく機能します。

だから私は crypt($enteredPassword, $saltFromDb) をやっています - この場合、ソルトはもちろん Og になります。通常、特定のユーザーのパスワード暗号化は正常に機能します。

問題が発生すると(そして、Apacheを再起動するまで永続的な変更になります)、cryptが同じ入力に対して同じソルトで異なる回答を返し始めることがわかりました。

ただし、一貫性があります。つまり、システムが間違っていると、crypt は間違った答えを返しますが、常に同じ間違った答えを返します。ページを繰り返し更新すると、同じ出力が表示されます。同じソルトが新たに不正確なクリプトの結果にも示されているため、ソルトがどこかで失われているわけではありません。

その後、Apache を再起動し、何も変更せずにスクリプトを再実行すると、crypt の結果は本来あるべき状態に戻ります。

それが最新の PHP (5.2.8) ではないことを感謝しますが、それが後のバージョンで修正された既知のバグであるかどうかを含め、これに関する意見を評価します (PHP のアップグレードは、多くのサイトでは満足のいく作業ではありません。アップグレードのたびにすべてを再テストする必要があります) - 既知の修正されたバグである場合は、明らかにすべてをできるだけ早くアップグレードします。それ以上は、暗号化を外部に委託する方が簡単でしょう。私のサイトの共通の場所。

任意の入力をいただければ幸いです。

マット・ペドルスデン

--- 更新: 2011 年 3 月 11 日

オペレーティング システムに関する以前のコメントの修正... - オペレーティング システムは Windows Server 2008 SP1 64 ビットです。申し訳ありませんが、覚えていると仮定するのではなく、再確認する必要がありました。マシンは、Dell 2950 8 GB RAM、Xeon プロセッサです。

私はKrtekが提案している線に沿って考え始めています-システムが不安定になったとき、新しいcrypt()を生成すると(つまり、変数を文字列に設定し、それを暗号化し、暗号と比較する非常に単純な例) - すべてうまくいきます。サーバーを再起動すると、再び以前の計算に戻ります。だから私は間違いなく、crypt() の結果を計算するために使用されるアルゴリズムを変更する何かに傾いています...これが起こる原因について何か考えはありますか? CRYPT_STD_DES などの値を出力しましたが、再起動しても変化しません。

これが起こる原因について何か手がかりを得た人はいますか?

それが何であれ、昨日は 1 日に 2 回起こったようで、最も奇妙でした。

これまでの回答に感謝します。

--- 更新: 2011 年 3 月 16 日

別のアップデートを提供したかっただけです。

これはまだ起こっていますが、その理由はまだ理解されていません。

将来誰かがこれに遭遇した場合に備えて、今後の私の解決策は、厄介なハックを行って、すべての crypt() 実行を外部の C# アプリケーションにプッシュし、PHP に依存する必要をなくすことだと思います。どこかで何かがうまくいかず、この時点で私が見ることができる唯一の解決策は、それを方程式から完全に削除することです.

もちろん、それがまだ起こるのであれば、それを知るのも興味深いでしょう! :)

皆さんありがとう。

4

4 に答える 4

2

なぜあなたは塩を読んでいますか?また、塩分はどうやってとっていますか?異なるアルゴリズムは、出力にソルトを含めるために異なる方法を使用します。

crypt 関数の出力全体を 2 番目の引数として使用するだけです。

  $crypted='Og12345678';
  if (crypt($_POST['password'], $crypted)==$crypted) {
      ....

そしてシングルパスDES?本当に?

前回私が見たとき、PHP crypt 実装はシステムによって提供された crypt() 関数を呼び出します-したがって、それが壊れている場合、PHP よりもあなたの OS である可能性が高くなります-しかし、あなたはあなたの OS が何であるかを言いませんでした.

于 2011-03-10T12:42:05.407 に答える
1

crypt() 関数に影響する Suhosin PHP セキュリティ パッチである可能性があります。多くの暗号化/ランダム方法が変更され、問題の原因になる可能性があります。

phpinfo() をチェックして、「suhosin」がページのどこかにあるかどうかを確認してください。そこにある場合は、php 構成でその機能の一部を無効にすることを検討してください。

于 2011-03-10T11:26:17.137 に答える
0

私は同じ問題に直面しました。vTigerCRM インストールをローカル マシンに移動してから、以前に保存したパスワードを使用したユーザー ログインが失敗し始めました。crypt() は、同じ引数を持つ異なる環境で異なるハッシュを返しているようです:

ローカル環境:

SYSTEM: Windows NT 6.1 build 7601 (Business Edition Service Pack 1) i586
PHP: 5.3.5

crypt('hello world','$1$ad0000000'):

     $1$ad00000008tTFeywywdEQrAl9QzV.M1

本番環境:

SYSTEM: Linux 2.6.18-338.9.1.el5.lve0.8.32 #1 x86_64
PHP: 5.3.5

crypt('hello world','$1$ad0000000'):

    $1$ad000000$8tTFeywywdEQrAl9QzV.M1
于 2011-08-21T07:31:58.567 に答える