【发布时间】: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'] 输出??