2011-09-06 27 views
0

這對於檢查我的密碼散列碼,hashing.php登錄問題 - 檢查輸入密碼與mysql中的哈希值?

<?php 
     //compare password with hashed one 
     public static function check_password($hash,$password) { 
      $full_salt=substr($hash,0,29); 

      $new_hash=crypt($password,$full_salt); 

      return ($hash==$new_hash); 
     } 
?> 

這是login.php中

<?php 
    require("scripts/hashing.php");    
    $password=$_POST['txtPassword']; 

    //checking in database if password exists or not 
    $checkPassword=mysql_query("SELECT * from $tbl_name WHERE Password='".$password."'"); 

    $resultPassword=mysql_fetch_array($checkPassword); 

    if(!hashing::check_password($resultPassword['Password'],$password)) { 
    //back to login 
    } 
?> 

的問題是,即使當用戶輸入錯誤的密碼,它允許用戶登錄。

編輯

<?php 
    class hashing { 

     //blowfish 
     private static $algo='$2a'; 

     //cost parameter 
     private static $cost='$10'; 

     public static function unique_salt() {   
      return substr(sha1(mt_rand()),0,22); 
     } 

     //generate a hash 
     function myhash($password) {        
      return crypt($password,self::$algo.self::$cost.'$'.self::unique_salt()); 
     } 

     //compare password with hashed one 
     public static function check_password($hash,$password) { 
      $full_salt=substr($hash,0,29); 

      $new_hash=crypt($password,$full_salt); 

      return ($hash==$new_hash); 
     }    
    } 
?> 
+0

死你嘗試只是你return語句之前呼應的結果? echo'hash:「'。$ hash。'」==「'。$ new_hash。'」'; –

+0

如果用戶填寫不在數據庫中的密碼,會發生什麼情況? '$ resultPassword'會是什麼?爲了這個價值,你的'check_password'會做什麼? – Konerak

+0

你的邏輯是有缺陷的。首先從數據庫中獲取所有行,其密碼與您的密碼相同(直接來自POST,而不是加密)。然後你檢查它們是否相等?那麼猜猜看 - 他們是!否則SELECT將無法工作。 – Konerak

回答

0

好的,我用md5來解決它。

登記:

$pass_hash=md5(mysql_real_escape_string($_POST['txtPassword'])); 
$insertQuery="INSERT INTO $tbl_name(Password) VALUES ('".$pass_hash."')"; 
$insert=mysql_query($insertQuery) or die ("Failed to register"); 

在登錄:

$pass_hash=md5(mysql_real_escape_string($_POST['txtPassword'])); 
$checkLogin=mysql_query("SELECT * from $tbl_name WHERE Username='".$username."'AND Password='".$pass_hash."'"); 
if(mysql_num_rows($checkLogin)==1) { 
    $row=mysql_fetch_array($checkLogin); 
    echo "Login success!"; 
} 
else { 
    echo "Login failed!"; 
} 
1

您是從$ _ POST拉動原密碼,並將其與一個散列密碼。

// Encrypted so that it can match in the database, otherwise it will never match up 
$password = my_crypt_fnction($_POST['txtPassword']); 

//checking in database if password exists or not 
$checkPassword=mysql_query("SELECT * from $tbl_name WHERE Password='".$password."'"); 
+0

那麼爲什麼任何密碼工作呢? – Konerak

+0

是的。我想讓它比較數據庫中的散列函數 – deepz

+0

可能是因爲他的代碼中存在更多的邏輯錯誤。解決這個問題是第一步。 –