我正在尝试使用$ salt变量创建sha256哈希值的密码。但由于某种原因它只是不起作用。现在已经工作了3个小时,我即将扯下头来。这是我的代码:
我会再试一次,对不起; o)
好的,我的脚本运行正常,直到我尝试将sha256添加到密码中。我有一个用于创建用户的文件:
$salt = "lollol";
$password = hash('sha256', $salt.$_POST['password']);
$sql = ("INSERT INTO members (username, password, name, last_name,company)VALUES('$username', '$password', '$name', '$last_name', '$company')")or die(mysql_error());
if(mysql_query($sql))
echo "Your accuont has been created.";
它似乎已正确添加到数据库中。我可以看到它正在用一些字母和数字进行哈希处理。
但是当我尝试登录时,它就不会。
我的login.php代码是:
$sql= "SELECT * FROM members WHERE username='$username' and password='$password'";
$result=mysql_query($sql);
$row=mysql_fetch_array($result);
$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$salt = "lollol";
$auth_user = hash('sha256', $salt.$password);
if($password == $salt.$auth_user){
echo "Logged in";
} else {
echo "Not logged in";
}
我明白了这一点,我想在登录时加密密码,但我不确定。我希望你们中的一些人可以帮助我。
答案 0 :(得分:9)
尝试登录时,再次将哈希与盐连接起来
$auth_user = hash('sha256', $salt.$password);
if($password == $salt.$auth_user){ // <-- $salt once more
echo "Logged in";
} else {
echo "Not logged in";
}
它应该有用,如果你只是删除它
$auth_user = hash('sha256', $salt.$password);
if($password == $auth_user){
echo "Logged in";
} else {
echo "Not logged in";
}
更新:更进一步
这里
$sql= "SELECT * FROM members WHERE username='$username' and password='$password'";
您尝试检索行,其中用户名与$username
匹配,密码与$password
匹配。在数据库中,密码已经过哈希处理($password
似乎根本没有定义),因此这个查询永远不会返回任何行。
$password = hash('sha256', $salt.$_POST['password']);
$username = mysql_real_escape_string($_POST['username']);
$sql= "SELECT * FROM members WHERE username='$username' and password='$password'";
$result=mysql_query($sql);
$result
现在应该包含与给定凭据匹配的 only 用户。它现在很容易
if (mysql_num_rows($result) === 1) {
echo "Logged in";
} else {
echo "Not logged in";
}
答案 1 :(得分:3)
您正在存储加密密码,但您的选择查询正在查找未加密的密码。
只需获取匹配的用户名(没有密码条件) - 用户名是唯一的,对吧?:
$sql= "SELECT * FROM members WHERE username='$username'";
$result=mysql_query($sql);
$row=mysql_fetch_array($result);
$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$salt = "lollol";
$auth_user = hash('sha256', $salt.$password);
if($row["password"] == $auth_user){
echo "Logged in";
} else {
echo "Not logged in";
}
答案 2 :(得分:2)
$password = $_POST['password'];
// This should be the users actual salt after you've found the user
// in the database by username or email, or other means
$salt = $users_stored_salt;
// This should be the exact method you use to salt passwords on creation
// Consider creating a functon for it, you must use the same salt
// on creation and on validation
$hashed_password = hash('sha256', $salt.$password.$salt);
// This is the user's hashed password, as stored in the database
$stored_password = $users_stored_password;
// We compare the two strings, as they should be the same if given the
// same input and hashed the same way
if ($stored_password === $hashed_password){
echo "Logged in";
} else {
echo "Not logged in";
}
错过了您的编辑,但希望这有帮助。
编辑:我发现你没有存储独特的哈希值。
如果您通过密码查找用户,则需要以与存储时相同的方式在查询中哈希密码:
$salt = $your_salt;
$hashed_password = hash('sha256', $salt.$_POST['password']);
$sql= "SELECT * FROM members WHERE username='$username' and password='$hashed_password'";
否则,您可以通过唯一的用户名(而非密码)查找,只需将散列输入与存储密码的值进行比较。
我现在很困惑。我的login_ac.php应该怎么样,如果我应该使用我在顶部提供给你的代码呢?
只需将查询更改为使用哈希密码查找(存储密码的方式)。
$sql= "SELECT * FROM members WHERE username='$username' and password='".hash('sha256', $salt.$_POST['password'])."'";
您可以删除其他验证和散列 - 如果找到该用户,则您知道输入有效。
请注意,只有当您知道对输入进行哈希处理的方式与创建时对密码进行哈希处理的方式完全相同时,此方法才有效。
答案 3 :(得分:0)
值得检查的是,数据库中的字段长度足以存储整个哈希密码而不会截断它。如果存储的密码丢失,您将永远不会在登录时获得密码匹配。