2013-01-15 5 views
5

これはPHPでcrypt()関数を初めて使用したため、なぜ機能していないのかわかりません。私のコードは、この資料に基づいています。私は、サンプルのパスワード「パスワード」を持つ関数を呼び出しhttp://www.techrepublic.com/blog/australia/securing-passwords-with-blowfish/1274PHP crypt()Blowfish関数が動作しない

function blowfishHash ($pw) { 
    //generate random salt 
    $salt = "$2y$10$"; 
    for ($i = 0; $i < 22; $i++) { 
     $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 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; 
} 

結果の塩は次のとおりです。$2y$10$NzRQNjTRfP4jXKvb4TCO.G
パスワードは"$2mV0NZp92R3g"です。これはかなり短すぎます。

誰かが私が間違っていることを理解するのを助けてくれますか?

+0

私はあなたの例をテストしました。これは記事と全く同じ結果を出力します。どのように$パスワードを出力/デバッグしますか?ウェブサイトで? 1 cli? – hek2mgl

+0

私はファイルに印刷しました(私はそのコード行を省略しました)。この機能に必要なPHPの特定のバージョンはありますか? – user1403777

+0

どのバージョンをお使いですか? (私は使用しています:5.3.10-1ubuntu3.4) – hek2mgl

答えて

2

コメントに記載されているとおり、PHP 5.2.xを使用しています。

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

+0

user1403777これはあなたの問題を解決しますが、答えには何の答えもありません。 stackoverflowで動作する... –

1

PHP 5.2のcryptはCRYPT_BLOWFISHをサポートしていないため、デフォルトでは塩をCRYPT_DESスタイルの塩として解釈するようにデフォルト設定されています。出力は "$ 2"で始まります。これは、CRYPT_DESが塩分入力から選択してハッシュの前に付いた2文字の塩で、出力長は正確なCRYPT_DES出力長と一致しています。

興味深いことに、CRYPT_BLOWFISHをサポートしている後のPHPバージョンでも、塩を2文字に切り捨てるだけで同じ結果が得られます。すなわち:CRYPT_BLOWFISHスタイル塩はPHP 5.2でエラーに使用された場合には理論的には

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

、これは後方互換性のために便利になるかもしれません。 「$」の文字が言うPHP crypt documentationあたりとしてCRYPT_DESの有効な塩の入力ではないので、

この

は実際に最近、私の混乱のビットを引き起こした:2つの文字で

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

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

cryptが実際に "$"を受け入れてCRYPT_DESをデフォルトにするよりもむしろドキュメントにあるようにエラーを返した場合、より明確で安全です。ここ

1

$2a$で始まる塩でハッシュ化

<?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 
    } 

?> 
0

最初だけフグがサポートされていました....私のふぐの暗号化機能です。

$2x$および$2y$潜在的なハイビット攻撃に対処するために、ボローフィッシュモードがPHP 5.3.7で追加されました。

PHP 5.2.17は、$2y$ブローフィッシュモードをサポートしていません。

これがコードが機能しない理由です。

関連する問題