2

$salt 変数を使用して sha256 ハッシュされたパスワードを作成しようとしています。しかし、何らかの理由でそれはうまくいきません。今これに 3 時間取り組んでいて、頭をもぎ取ろうとしています。これが私のコードです:

もう一度やってみます、ごめんなさい(;o;)

OK、パスワードに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 に答える