0

私はこのログインシステムを使用していますが、ハッシュ256が(ついに)追加されました。今日の初め、私は@KingCrunchや他の何人かと非常に長いスレッドを持っていて、私を大いに助けてくれました。どうもありがとうございました。

しかし、私が今やりたくないのは、次を使用して$saltを一意にしたいということです。

$salt = uniqid(mt_rand());  $salt = uniqid(mt_rand());  
                            $password = hash('sha256', $salt.$_POST['password']);

新しいメンバーを作成すると、これが設定され、「salt」という行の下のデータベースに追加されます。

作成したクレデンシャルを使用してログインしようとすると、ログインできなくなります。

$salt = $row['salt'];
$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);
$row=mysql_fetch_array($result);

これは私のlogin_ac.phpで、ここで私は$saltになりましたrow['salt']。行ソルトのどの列を選択する必要があるかを教えていないので、これが成功するとは思いません。

だから私の質問は:これをどのように機能させるのですか?別のクエリなどを作成する必要がありますか?

私は塩をユニークにしたいので、私は$saltから選ぶ必要があります。row['salt']

4

2 に答える 2

1

他の質問での私の答えとは異なり、ここでユーザーの行全体を取得し、php内のハッシュを比較します(覚えておいてください:他の質問のSQLクエリ内で比較することをお勧めします)。

$username = mysql_real_escape_string($_POST['username']);
$sql= "SELECT * FROM members WHERE username='$username'";
$result=mysql_query($sql);
$row=mysql_fetch_array($result);

これにより、ユーザーの行が取得されます。ユーザー名がデータベース内に存在しない場合は、(通常どおり)mysql_num_rows($result)返されます。0ただし、その後、ハッシュを再作成して、データベース内に保存されているものと比較することができます

if (hash('sha256', $row['salt'] . $_POST['password']) === $row['password']) {
  // fine
}
于 2011-06-21T23:22:26.820 に答える
0

前の質問で指摘したように、ユーザー名が一意である場合は、パスワードでデータベースにクエリを実行する必要はありません。ユーザー名でクエリするだけです。次に、返される行にソルトとパスワードの両方が含まれるため、PHPでセキュリティ検証を完了することができます。

于 2011-06-21T23:20:06.633 に答える