2

我正在尝试创建带有 $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";  
}  

我明白了,当我想登录时,我必须加密密码,但我不确定。我希望你们中的一些人可以帮助我。

4

4 回答 4

10

尝试登录时,您再次将哈希与盐连接起来

$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现在应该包含与给定凭据匹配的唯一用户。现在很容易

if (mysql_num_rows($result) === 1) {
  echo "Logged in";
} else {
  echo "Not logged in";
}
于 2011-06-21T21:15:42.710 回答
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";  
}  
于 2011-06-21T21:26:02.937 回答
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'])."'";  

您可以删除其他验证和散列 - 如果您找到用户,那么您知道输入是有效的。

请注意,这仅在您知道散列输入的方式与您在创建时散列密码的方式完全相同时才有效。

于 2011-06-21T21:13:32.577 回答
0

值得检查的是数据库中的字段长度是否足够大,可以存储整个散列密码而不截断它。如果存储的密码缺少结尾,登录时您将永远不会得到密码匹配。

于 2014-03-03T17:45:30.347 回答