Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用盐撒完pw后如何登录<==编辑版本#2==>;_Php_Passwords_Hash_Sha1 - Fatal编程技术网

Php 用盐撒完pw后如何登录<==编辑版本#2==>;

Php 用盐撒完pw后如何登录<==编辑版本#2==>;,php,passwords,hash,sha1,Php,Passwords,Hash,Sha1,这是我的第二次编辑。这几天来我一直把头撞在墙上,感觉自己离得很近。我已经尝试了许多不同版本的第三个代码块,但就是无法得到它。知道我做错了什么吗(这是第三个被更改的代码块) 以下是我用来更新现有密码的方法: $query = "SELECT * FROM `Users`"; $request = mysql_query($query,$connection); while($result = mysql_fetch_array($request)) { $alpha = "ABCDEFGH

这是我的第二次编辑。这几天来我一直把头撞在墙上,感觉自己离得很近。我已经尝试了许多不同版本的第三个代码块,但就是无法得到它。知道我做错了什么吗(这是第三个被更改的代码块)

以下是我用来更新现有密码的方法:

$query = "SELECT * FROM `Users`";
$request = mysql_query($query,$connection);
while($result = mysql_fetch_array($request)) {
    $alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcedfghijklmnopqrstuvwxyz1234567890";
    $rand = str_shuffle($alpha);
    $salt = substr($rand,0,40);
    $hashed_password = sha1($salt . $result['Password']);
    $user = $result['id'];

    $query2 = "UPDATE `Users` SET `salt` = '$salt' WHERE `id` = '$user'";
    $request2 = mysql_query($query2,$connection) or die(mysql_error());
    $query3 = "UPDATE `Users` SET `encrypted_passwords` = '$hashed_password' WHERE `id` = '$user'";
    $request3 = mysql_query($query3,$connection) or die(mysql_error());
}
所以现在我想允许用户使用他们注册时使用的密码登录,此时他们只能使用哈希密码登录。显然,这还没有应用到真正的数据库中

以下是我需要更改的登录页面上的查询:

    if(isset($_POST['subSignIn']) &&
       !empty($_POST['email']) &&
       !empty($_POST['password'])) {

        $email = mysql_real_escape_string($_POST['email']);
        $password = mysql_real_escape_string($_POST['password']);
        $query = "SELECT
             `id`,`email`,`password` FROM `Users`
             WHERE `Email` = '" . $email . "' AND
             `Password` = '" . $password . "'  &&
             `Status` = 'active' LIMIT 1";
        $request = mysql_query($query,$connection) or die(mysql_error());

        if(@mysql_num_rows($request)) {

            $result = mysql_fetch_array($request);
            $_SESSION['LIFE']['AUTH'] = true;       
            $_SESSION['LIFE']['ID'] = $result['id'];

$query = "UPDATE `Users` SET` LastActivity` = '" . date("Y-m-d") ." " . date("g:i:s") . "'   WHERE `id` ='" .mysql_real_escape_string($_SESSION['LIFE']['ID']) . "' LIMIT 1";

            mysql_query($query,$connection);

            if(!empty($_POST['return'])) {          
                header("Location: " . $_POST['return']);        
            }else{
                header("Location: Dashboard.php?id=" . $_SESSION['LIFE']['ID']);
            }
        }else{
            $_SESSION['LIFE']['AUTH'] = false;      
            $_SESSION['LIFE']['ID'] = false;    
        }
我一直在搜索webernet的方法,但我想我会利用这里所有的伟大思想,寻找一个正确方向的建议/方法/教程/要点


我没有时间浏览整个代码块,但基本的salt/hash验证如下所示:

$user         // User has a $password and a $salt. $password = hash($plaintext . $salt);
$password     // Password we are checking.
return $user->password == hash($password . $user->salt);

如果您想验证输入的密码,您将执行与原始密码相同的操作:在salt前面加上前缀并对该值进行散列

因此,查找对原始密码进行哈希运算时使用的salt,并在对输入的密码进行哈希运算时使用它,然后将存储的哈希与新计算的哈希进行比较。所以基本上:

$query = "SELECT `salt`, `password` FROM `Users` WHERE `Email` = '" . $email . "'";
$request = mysql_query($query,$connection) or die(mysql_error());
if (mysql_num_rows($request)) {
    $row = mysql_fetch_assoc($request);
    if (sha1($row['salt'] . $_POST['Password']) === $row['password']) {
        // user authentic
    } else {
        // user not authentic
    }
}
如果它们相同,则输入的密码可能与原始输入的密码相同


1) 这可能是相同的,也可能不是完全相同的,因为总有两个输入值具有相同哈希值的可能性。

您能让第三个代码块更可读吗?
我会这样做的-

  • 当他们注册时加密它,存储密码+salt
  • 当他们登录时,获取与他们尝试登录的用户名关联的salt
  • 将他们输入的密码(登录时)与数据库中的salt进行散列
  • 将登录密码与数据库中的密码进行比较
应该很容易

例如:

$hashed_password = sha1($salt . $result['Password']);
$hashed_password
$salt
存储在数据库中

当他们登录时,您可以将上面的
$hashed_password
与密码进行比较,密码如下:

$password = sha1($row['salt'] . $_POST['password']);

有意义吗?

您首先需要通过搜索输入的用户名从数据库中获取salt密钥,然后将输入的密码与从数据库中获取的salt进行散列,并检查它是否与数据库中用户名的密码匹配。它看起来像这样:

$query = "SELECT salt FROM Users WHERE username='$user'";
$result = mysql_query($query) or die ("AAAAGH!  *Thud*");
$row = mysql_fetch_assoc($result);
$salty_password = sha1($row['salt'], $_POST['password']);
$query = "SELECT * FROM users WHERE username='$user' AND password='$salty_password'";
$result = mysql_query($query) or die ("AAAAGH!  *Thud*");
if (mysql_num_rows($result)) {
    echo "Successfully authenticated!";
}
else {
    echo "Failed to Authenticate.";
}

看起来,当用户创建帐户时,您实际上并没有使用用户密码

在第一段代码中:

$hashed_password = sha1($salt . $result['Password']);
应该是这样的:

$hashed_password = sha1($salt . $_POST['Password']);

我认为您只存储散列的salt,基本上可以使用任何空密码登录

你的意思是如何验证输入的密码,对吗?你应该正确地缩进你的代码,使其可读性和一致性…@马克:是的,我知道。最近一直在处理非PHP的东西。我差点忘了
$
。谢谢你给我时间@joshK。真的很自以为是:)我想你应该稍微详细说明一下“可能:)@JoshK即使每个用户都有唯一的散列和盐,也有发生这种情况的可能性?@Lightning:可能性很低。MD5冲突已经用字节数组演示过,而不是实际情况。
$hashed_password = sha1($salt . $result['Password']);
$hashed_password = sha1($salt . $_POST['Password']);