我正在为我的网络应用程序制作登录/注册表单。注册工作到目前为止,但后来在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显示相同代码的不同输出)而不匹配。
答案 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?