【问题标题】:The same code produces different results in browser and localhost/phpmyadmin(database)相同的代码在浏览器和 localhost/phpmyadmin(database) 中产生不同的结果
【发布时间】:2015-09-13 02:07:27
【问题描述】:

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

我的问题涉及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

盐和密码是一样的……循环也是以同样的方式完成的……一切都是一样的,只是浏览器测试和本地主机测试带来了一些变化?而且我不知道这里发生了什么。

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

我的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
} 

以上代码获取用户在登录表单上输入的正常密码。 Row ['salt'] 是从该用户输入的特定用户名的数据库 salt 列中检索到的 salt 值。在散列,然后添加盐,然后循环此代码之后,所做的一切与 sign_up 代码所做的相同。最后在$check_password === $row['password'] 期间,由于上述问题(浏览器和本地主机显示相同代码的不同输出),它不匹配。

【问题讨论】:

  • 任何你试图重新发明轮子而不是使用php.net/manual/en/ref.password.php的原因
  • 你的表单有没有js验证/哈希??
  • 分享您的表单/ js 以及两个密码字符串,您保存的一个和一个来自用户通过浏览器输入。
  • 所以要么你的密码不匹配——需要验证它——你能 echo $_POST['password'] for "Testgrg061"???
  • @SOuřaanGřg 你检查了什么是 echo $_POST['password'] 输出??

标签: php mysql hash


【解决方案1】:

它对我有用,所以我认为问题在于您在 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?

【讨论】:

  • bro ya $row['salt'] 和 $row['password'] 正在从数据库中正确检索值。数据库上的字段名称“密码”就足够了,我的哈希是 sha256,它是 64 位哈希,并且存储正确。是的,我为 signup_form 和 signin_form 使用了相同的密码 Testgrg061 但结果不同,因为我已经发布了浏览器密码和本地主机密码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多