1

最近、メンバー テーブルに格納されている一意のソルトを使用するクラスを追加しました。これは、ソルトを使用する前のログイン スクリプトです。

    $sql = 'SELECT id, username FROM member WHERE username = ? AND pass = ?';

    $result = $this->DB->query($sql, array($username, $pass));
    foreach($result as $record) {
        $user = [
    "id" => $record['id'],
    "username" => $record['name']];
}

if (empty($user)) {
        // Display errors
    } else {
            // Login by sending the array of data to login function
        self::login($user);
    }

さて、私も塩を手に入れたいです。複数のクエリを使用せずにこれを行う方法はありますか? ユーザーパスとソルトを取得するためのクエリから開始することで機能させることができますが、より良い方法はありますか? ハッキングのように感じますか、それとも単に避けられないのでしょうか?

4

2 に答える 2

4

あなたはそうすることができます(passがとして作成され、テーブル内にMD5($salt . $password)名前が付けられた列があると仮定します):saltmember

$sql = 'SELECT id, username FROM member WHERE username = ?
           AND pass = MD5(CONCAT(member.salt, ?))';

このようにして、MySQL は、パスワードとソルトを挿入CONCATた後に作成された保存されたハッシュを直接チェックします。

于 2012-12-05T10:01:22.613 に答える
1

データベースはパスワード用の安全なハッシュ関数を提供していないため、MD5他の高速ハッシュ関数をパスワードのハッシュに使用しないでください。

そのため、単一のクエリでパスワード ハッシュを確認することはできません。代わりに、データベースに対して単一のクエリを実行して、パスワード ハッシュを取得できます。

SELECT username, pass FROM member WHERE username = ?

passこれで、SQL ではなく php でチェックできるようになりました。この方法では、必要なクエリも 1 つだけですが、安全なハッシュ アルゴリズムを使用できます。ソルトはpass、ハッシュ値と一緒に同じフィールドに格納できます。

BCryptを使用することをお勧めします。PHP 5.5 には独自の機能がpassword_hash()ありpassword_verify()、このタスクを簡素化する準備ができています。PHP 5.3/5.4 用の互換パックが利用可能で、 password_compatからダウンロードできます。

于 2012-12-05T11:53:13.860 に答える