我已注册新用户并保存了用户名,密码和&使用以下散列方法在DB中使用盐:
if(isset($_POST['register']))
{
$password = $_POST['password']
function sanitize($data)
{
$data=trim($data);
$data=htmlspecialchars($data);
$data=mysql_real_escape_string($data);
return $data;
}
$password = sanitize($password);
function createSalt()
{
$salt = bin2hex(mcrypt_create_iv(32,MYCRYPT_DEV_URANDOM));
$hash = hash("sha256", $salt);
$final = $salt.$hash;
return $final;
}
$hashedPassword = hash("sha256", $password);
$salt = createSalt();
$hashedPassword = hash("sha256", $hashedPassword.$salt);
$query = sprintf("INSERT INTO users(username, password, salt) VALUES('%s','%s','%s')",$username, $hashedPassword, $salt);
}
稍后在尝试login.php时,我输入的密码是我在注册时保存的,并使用以下代码检查输入的密码是否与数据库中的密码相同
if(isset($_POST['login']]))
{
$password = $_POST['password']
function sanitize($data)
{
$data=trim($data);
$data=htmlspecialchars($data);
$data=mysql_real_escape_string($data);
return $data;
}
function validateUser()
{
session_regenerate_id (); //this is a security measure
$_SESSION['valid'] = 1;
$_SESSION['username'] = $username;
}
$password = sanitize($password);
$query = sprintf("SELECT * FROM users WHERE username = '%s'",$username);
$sql = mysql_query($query);
$count = mysql_num_rows($sql);
$row = mysql_fetch_array($sql);
if($count<1)
{
echo $count;
unset($_POST['login']);
header("location:login.php");
exit;
}
$hash = hash("sha256", $password);
$salt = $row['salt'];
$hash = hash("sha256",$hash.$salt);
echo $hash."<br />".$row['password']."<br /><br />";
if($hash != $row['password'])
{
unset($_POST['login']);
header("location:login.php");
exit;
}
else
{
validateUser();
unset($_POST['login']);
header("location:index.php");
exit;
}
}
这些密码未匹配。 请告诉我这段代码有什么问题。
答案 0 :(得分:0)
您的代码没有任何问题。
存储在数据库中的salt值被截断,因为varchar值很低,会将salt列的varchar值增加到200-300,而不是试试这个..它运行正常。
当我发现这搞砸了结果时,我很沮丧。
DINS
答案 1 :(得分:0)
实际上我不明白为什么这不起作用,你所显示的代码应该产生相同的值,也许你可以检查一下,你从数据库中读取的盐是否与你写入数据库中的相同
尽管如此,我还是不愿意继续走这条路,这里有很多问题。
htmlspecialchars
和mysql_real_escape_string
这样做是没有意义的,如果你要去无论如何都要计算哈希值。)crypt()
函数将创建一个已包含salt的哈希值。我邀请您阅读有关hashing passwords的本教程,您也会找到一个PHP示例,我建议使用phpass库。