相同的代码在浏览器和localhost / phpmyadmin(数据库)中产生不同的结果

时间:2015-09-13 02:07:27

标签: php mysql hash

我正在为我的网络应用程序制作登录/注册表单。注册工作到目前为止,但后来在sign_in表格上我被卡住了。

我的问题涉及sign_up表单与sign_in表单之间的密码匹配,如果密码匹配,则让该有效用户访问私人页面。

以下代码来自我的sign_up表单,用于处理用户密码的哈希

    $final_pswd = "Testgrg061";//I set a default password 
    //because i'm testing this code alone on browser to 
    //know exactly what output this code produce.

    $salt = 88888888; //This salt was also set default by me for only 
     //testing purposes.Ya I know we have to use a code which produce it randomly. 

    $encriptpass = hash('sha256', $final_pswd . $salt); 
        for($round = 0; $round < 65536; $round++) 
        { 
            $encriptpass = hash('sha256', $encriptpass . $salt); 
        } 

    //It produce a password like below on $encriptpass variable in browser test!!
      $encriptpass = 2c19f750f242e16102553d3d749ab80fa93a736aa210c70e173a0207604c70c6

但是使用相同的代码和相同的密码,当我尝试通过localhost从sign_up表单在数据库上存储密码时,我的密码列会获得相同密码的不同哈希值,如下所示:

password - f0b3a1a382d1899453021f2dbae7c39cf2b547721bbb40d984c14deae7c7662f

Salt和密码是一样的...循环也以同样的方式完成......一切都是相同的浏览器测试和localhost测试带来了一些变化?我不知道这里发生了什么。

这就是我尝试登录时始终出现“用户名或密码无效”错误对话框的原因。最有趣的是,当我使用浏览器测试的哈希编辑数据库中的密码列时,每个进程都正常工作,我成功进入私有页面!我使用了默认的salt值,但是当我使用一些代码生成随机salt值时,问题可能是相同的。

我的sign_in代码如下:

$check_password = hash('sha256', $_POST['password'] . $row['salt']); 
for($round = 0; $round < 65536; $round++) 
{ 
    $check_password = hash('sha256', $check_password . $row['salt']);
} 

if($check_password === $row['password']) 
{
    // If they do, then we flip this to true 
    $success = true;//It was set false in above
}     
if(success){
    //creating session and private page concern codes
} 

以上代码获取用户在sign_in表单上输入的普通密码。 Row ['salt']是从该用户输入的特定用户名从数据库salt列检索的salt值。在散列然后添加salt然后循环此代码后,所有内容都与sign_up代码相同。最后在$check_password === $row['password']期间由于上述问题(浏览器和localhost显示相同代码的不同输出)而不匹配。

1 个答案:

答案 0 :(得分:0)

它对我有用,所以我认为问题在于你在mysql中存储的值。

$final_pswd = "Testgrg061";//I set a default password
//because i'm testing this code alone on browser to
//know exactly what output this code produce.

$salt = 88888888; //This salt was also set default by me for only
//testing purposes.Ya I know we have to use a code which produce it randomly.

$encriptpass = hash('sha256', $final_pswd . $salt);
for($round = 0; $round < 65536; $round++)
{
    $encriptpass = hash('sha256', $encriptpass . $salt);
}
echo $encriptpass.'<br />';



$check_password = hash('sha256', $final_pswd . $salt);
for($round = 0; $round < 65536; $round++)
{
    $check_password = hash('sha256', $check_password . $salt);
}
echo $check_password.'<br />';

if($check_password === $encriptpass)
{
    // If they do, then we flip this to true
    $success = true;//It was set false in above

}

var_dump($success);

$ row ['salt']和$ row ['password']可以吗?名为“密码”的字段足够长? $ _POST ['password']包含Testgrg061?