3

Crypt は同じ入力データで異なるハッシュを生成しており、以前は機能していた [次の] ハッシュ ジェネレーター/チェックは、認証ユーザーに対して機能しなくなりました。

public static function blowfish($password, $storedpass = false) {
    //if encrypted data is passed, check it against input ($info) 
      if ($storedpass) { 
            if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) { 
                return true; 
            }  else { 
                return false; 
            } 
      }  else { 
          //make a salt and hash it with input, and add salt to end 
          $salt = ""; 
          for ($i = 0; $i < 22; $i++) { 
            $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
          } 
          //return 82 char string (60 char hash & 22 char salt) 
          return crypt($password, "$2y$08$".$salt).$salt; 
     }
}

私は頭を壁にぶつけていますが、Zend の内部アルゴリズムと PHP とオペレーティング システムのアルゴリズムの違いに答えは見つかりませんでした。または PHP 5.3.8 とそれ以前の違い...

編集:私の質問は技術的に回答されており、適切に質問しなかったのは私のせいです。私は実装しました:

$salt = substr(bin2hex(openssl_random_pseudo_bytes(22)), 0, 22);
          //for ($i = 0; $i < 22; $i++) { 
            //$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
          //} 

私の本当の質問は次のとおりです。次の関数の戻り値が異なるのはなぜですか?

print(substr($storedpass, 0, 60)."<br />");

戻り値: $2y$08$43f053b1538df81054d4cOJyrO5/j7NtZBCw6LrFof29cLBs7giK6

print(crypt($password, "$2a$08$".substr($storedpass, 60)));

戻り値: $2a$08$43f053b1538df81054d4cOPSGh/LMc0PZx6RC6PlXOSc61BKq/F6.

4

1 に答える 1

1

salt乱数を使って を作成しているため、

この関数mt_rand()は、呼び出すたびに乱数を作成し、オプションで最小、最大パラメーターを使用します。通常、強力な暗号化パスワード ハッシュでは、Cryptographically Secure Pseudo-Random Number Generator (CSPRNG) を使用して Salt を生成する必要があります。

それからあなたの問題に来てください.ZENDとphpのアルゴリズムに違いはないと思います. zend はコア php をラップするフレームワークであるため、それを利用します。

パスワードを確認するには、cryptチェックのしくみは

crypt($password, $stored_hash) == $stored_hash;

最初にハッシュするときにハッシュを保存すると、これで簡単に検証できます。

これが実際にここで起こっていることです。ハッシュを関数blowfishに2番目のパラメーターとして渡すと、ソルトに関係なくブール値で検証が返されます。

if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) { 
    return true; 
}  else { 
    return false; 
}

ハッシュとセキュリティに関する情報については、これをお読みください

お役に立てれば

于 2012-08-15T17:59:56.483 に答える