2012-11-09 102 views
0

我已经注册一个新用户,并使用下面的散列方法保存在数据库中的用户名,密码&盐:注册用户的密码和登录时输入的密码不匹配

if(isset($_POST['register'])) 
    { 
    $password = $_POST['password'] 

    function sanitize($data) 
    { 
     $data=trim($data); 
     $data=htmlspecialchars($data); 
     $data=mysql_real_escape_string($data); 
     return $data; 
    } 

    $password = sanitize($password); 

    function createSalt() 
    { 
     $salt = bin2hex(mcrypt_create_iv(32,MYCRYPT_DEV_URANDOM)); 
     $hash = hash("sha256", $salt); 
     $final = $salt.$hash; 
     return $final; 
    } 

    $hashedPassword = hash("sha256", $password); 
    $salt = createSalt(); 
    $hashedPassword = hash("sha256", $hashedPassword.$salt); 

    $query = sprintf("INSERT INTO users(username, password, salt) VALUES('%s','%s','%s')",$username, $hashedPassword, $salt); 
} 

而且后来试图在login.php中,我进入我在注册过程中保存了相同的密码,并使用下面的代码来检查,如果输入的密码是一样的人在DB

if(isset($_POST['login']])) 
{ 
      $password = $_POST['password'] 

    function sanitize($data) 
    { 
     $data=trim($data); 
     $data=htmlspecialchars($data); 
     $data=mysql_real_escape_string($data); 
     return $data; 
    } 

    function validateUser() 
    { 
     session_regenerate_id(); //this is a security measure 
     $_SESSION['valid'] = 1; 
     $_SESSION['username'] = $username; 
    } 

    $password = sanitize($password); 

    $query = sprintf("SELECT * FROM users WHERE username = '%s'",$username); 
    $sql = mysql_query($query); 
    $count = mysql_num_rows($sql); 

    $row = mysql_fetch_array($sql); 

    if($count<1) 
    { 
     echo $count; 
     unset($_POST['login']); 
     header("location:login.php"); 
     exit; 
    } 

    $hash = hash("sha256", $password); 
    $salt = $row['salt']; 
    $hash = hash("sha256",$hash.$salt); 

    echo $hash."<br />".$row['password']."<br /><br />"; 

    if($hash != $row['password']) 
    { 
     unset($_POST['login']); 
     header("location:login.php"); 
     exit; 
    } 
    else 
    { 
     validateUser(); 
     unset($_POST['login']); 
     header("location:index.php"); 
     exit; 
    } 
} 

这些密码都没有得到匹配。 请让我知道这段代码有什么问题。

+0

很难用你所显示的小代码来判断。 '$ hash = hash(“sha256”,$ password);'和$ hash = hash(“sha256”,$ row ['password']);''相同。 – cegfault

+0

@cegfault:更新上面的代码..请指教! –

回答

0

你的代码没有问题。

存储在数据库中的盐值会被截断,因为varchar值很低,因此将盐列的varchar值增加到200-300,并尝试此操作。它会正常运行。

我facepalmed当我发现这是拧的结果..

DINS

+0

是的。修复了这个问题... varchar值只有64 ..更新到200 ..现在工作..谢谢Dinesh !!! –

0

其实我不明白为什么这不应该工作,你必须所示的代码,应该产生相同的值,也许你可以检查,你从数据库中读出的盐是否与你写入数据库的盐相同。

尽管如此,我不想在这条路上走得更远,这里有很多问题。

  1. 首先,SHA-256是不是一个好的选择哈希密码,而是使用慢速键导出函数一样BCrypt
  2. 你不应该无需逃避输入数据,如果你需要逃避他们,你应该只针对特定目标系统(htmlspecialcharsmysql_real_escape_string没有任何意义,如果你打算无论如何要计算哈希)做到这一点。
  3. 要创建一个盐,你使用随机源,这是很好的。之后使用散列创建盐,绝不会使盐更随机。
  4. 没有必要在数据库中有两个单独的密码和salt字段。 Php的crypt()函数将创建一个散列值,该值已经包含salt。

我想请您阅读本教程的hashing passwords,你会发现一个PHP的例子太多了,我会建议使用phpass库。

+0

感谢Martin提供的信息。我是新开发的PHP。我会在编写代码时对此进行记录,并对现在进行更改。 但是,我报告的问题是固定的。这是因为salt列的varchar值已修复。从64个字符更新为200个 –

+0

@Roshan Raikar - 这也是我的看法(检查数据库值),但很高兴听到您可以解决您的问题。无论如何看看教程,你会节省时间,它使数据库更简单。 – martinstoeckli

相关问题