5

PHP で crypt() 関数を使用するのはこれが初めてで、なぜ機能しないのかわかりません。私のコードは次の記事に基づいています: http://www.techrepublic.com/blog/australia/securing-passwords-with-blowfish/1274

function blowfishHash ($pw) {
   //generate random salt
   $salt = "$2y$10$";
   for ($i = 0; $i < 22; $i++) {
       $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
   }
  $hash = crypt($pw, $salt);

  //printout to file
  $file = fopen("debug.txt", "w+");
  fwrite($file, "\n\n\n".$pw);
  fwrite($file, "\n\n\n".$salt);
  fwrite($file, "\n\n\n".$hash);
  fclose($file);

  return $hash;
}

サンプルパスワード「password」で関数を呼び出しました。

結果のソルトは次のとおりでした。$2y$10$NzRQNjTRfP4jXKvb4TCO.G
しかし、パスワードは"$2mV0NZp92R3g"短すぎたようです。

誰かが私が間違っていることを理解するのを手伝ってもらえますか?

4

4 に答える 4

2

コメントで述べたように、PHP 5.2.x を使用しています。

Blowfish の実装は、PHP >= 5.3.x でのみ使用できます。何らかの理由で新しい PHP バージョンをインストールできない場合は、Blowfish を古い PHP バージョンで動作させる方法の詳細について、こちらを参照してください。

于 2013-01-24T17:33:50.543 に答える
1

cryptPHP 5.2 では CRYPT_BLOWFISH がサポートされていないため、デフォルトでソルトを CRYPT_DES スタイルのソルトとして解釈します。出力が「$2」で始まることに注意してください。これは、CRYPT_DES がソルト入力から選択し、ハッシュの先頭に追加した 2 文字のソルトであり、出力の長さは正確な CRYPT_DES 出力の長さと一致します。

興味深いことに、ソルトを 2 文字に切り詰めるだけで、CRYPT_BLOWFISH をサポートする新しい PHP バージョンでも同じ結果を得ることができます。すなわち:

crypt('password', '$2y$10$NzRQNjTRfP4jXKvb4TCO.G')   /* in PHP 5.2 */ 
 ==
crypt('password', '$2')   /* in PHP 5.4 */

理論的には、CRYPT_BLOWFISH スタイルのソルトが PHP 5.2 で誤って使用された場合、後方互換性のためにこれが役立つ可能性があります。

PHP crypt documentationによると、「$」文字は CRYPT_DES の有効なソルト入力ではないため、これは実際に最近少し混乱を引き起こしました。

アルファベット "./0-9A-Za-z" の 2 文字のソルトを使用した標準の DES ベースのハッシュ。ソルトで無効な文字を使用すると、crypt() が失敗します。

crypt()しかし、ここで「$」文字は明らかにv5.2 と v5.4 の両方で受け入れられているようです。

crypt「$」を受け入れて CRYPT_DES をデフォルトにするのではなく、ドキュメントに記載されているように実際に失敗を返した方が、より明確で安全です。

于 2013-03-18T19:40:13.187 に答える
1

これが私のフグ暗号化関数です....

<?php
    function bcrypt($input, $salt=null, $rounds=12) {
        if($rounds < 4 || $rounds > 31) $rounds = 12;
        if(is_null($salt)) $salt = sprintf('$2a$%02d$', $rounds).substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22);
        return crypt($input, $salt);
    }
    $hash = bcrypt('password');
    if($hash = bcrypt('password', $hash)) {
        // password ok
    }

?>
于 2013-08-15T22:43:32.157 に答える