2016-03-31 24 views
4

私はこのコードを少し前に書いていますが、今は新しいプロジェクトで復活していますが、それはうまくいかないと思われます。ハッシュを検証する。Blowfishの暗号化 - ハッシュが作成されても検証されません

最初のpasswordEncrypt()関数を呼び出すと、次の2つの関数が呼び出されます。

ログインしようとすると、ログインする代わりにcheckPassword()関数が呼び出され、 'yes'が返される代わりに、 'no'と表示されるセクションに移動します。

新鮮な目が見える場合は、事前に感謝してください!

// Encrypt user password 
function passwordEncrypt($password) { 
    // set the salt 
    $salt = substr(md5(time()), 0, 22); 

    // encrypt using blowfish with a load of 10 
    $password = crypt($password, '$2a$10$' . $salt); 

    // return the encrypted hash 
    return $password; 
} 

/* 
    Check password function when logging in 
    first we select the password from the supplied username from the database 
    // get the row and set the hash to the currect password from the database 
    //run the salts etc and check to see if the passwords match 
*/ 
function checkPassword($userName, $password, $db){ 
    $sql = 'SELECT password FROM users WHERE userName = :userName'; 
    $stmt = $db->prepare($sql); 
    $stmt->bindValue(':userName', $userName, PDO::PARAM_STR); 
    $stmt->execute(); 

    $numRows = $stmt->rowCount(); 

    if ($numRows > 0) { 
     $row = $stmt->fetch(); 
     $hash = $row['password']; 

     // run the hash function on $password  
     $fullSalt = substr($hash, 0, 29); 
     $new_hash = crypt($password, $fullSalt); 

     // Check that the password matches 
     if($hash == $new_hash) { 
      echo 'yes'; 
      exit; 
      return true; 
     } else { 
      echo 'no'; 
      exit; 
      return false; 
     } 
    } else { 
     echo 'way'; 
     exit; 
     return false; 
    } 
} 

私は、パスワードを登録し、それを試してみました、これはそれが

パスワード返すものですしている:$ 2aに入力された$ 10 $ 023d3086e8462207a1fecueWH4Ub40MWbQJ7F9 :$ 2A $ 10 $ 023d3086e8462207a1fecueWH4Ub40MWbQJ7F9hapWU3lYxlg3AAa 何

だから、それはありませんhapWU3lYxlg3AAaの追加

+0

パスワード列の長さとハッシュ文字列の長さは何ですか? –

+0

btw、あなたの出口はあなたのリターンをキャンセルしています。 –

+0

あなたが誰かにpingする方法を知っていれば、良い。あなたの質問は魔法の答えを与える資格はありません。 –

答えて

3

"列の長さは何ですか?40-50?60?othそう? $ 2a $ 10 $ 023d3086e8462207a1fecueWH4Ub40MWbQJ7F9は短すぎることを意味します。 - フレッド-ii-」

"ああ、データベース内の45 - トム・C"あり

あなたが行く、列の長さが短すぎるとニーズです。 〜になるように60.

マニュアルは255を提案します。
Slight corrアクセサリー: 255は、password_hash()のマニュアルの使用を示唆しています。しかし、マニュアルが将来のために念頭に置くべきことを示唆している場合には、255を実際に使用することが最善であり、"良い選択"であると考えます。

行を消去し、列を60以上に変更してから、新しいハッシュを作成して再度ログインする必要があります。

$ 2A $ 10 $ 023d3086e8462207a1fecueWH4Ub40MWbQJ7F9hapWU3lYxlg3AAa

は60の長い


脚注です:

いくつかはそれは難しいcrypt()で動作するように見つけることを言った、とpassword_hash()を使用してきましたまたは互換パック(PHP < 5.5の場合)https://github.com/ircmaxell/password_compat/が動作している簡単に簡単です。 選択肢はです。

もスタック上で、このQ & Aを参照してください:

+0

幻想的な仲間、新鮮な目の両方が必要でした。データベースを再構築するときに、フィールドの長さについて考える必要はありませんでした。再度ありがとう –

+0

@TomCあなたは最も歓迎トムです。まもなく私はあなたのコードを見て、正当に見えましたが、私の* Spidey sense *は列の長さにうずくまりました。 *乾杯* –

+0

葉の長さをチェックすることは、将来のために私のチェックリストにまっすぐ入ってきました。あなたのスパイシーな感覚がポイントです! –

関連する問題