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']);