0

私はWeb開発とデータベースに不慣れで、妥当なセキュリティと速度でパスワード認証を実装しようとしています。パスワードのハッシュについて読み、人々がレインボーテーブルを生成するのを防ぐために、各ユーザーに固有のソルトを追加しました。

私の質問は、ユーザーを確認するために検索しなければならない時間を扱っています。いつでも誰が接続しようとしているのかわからないので、ソルト列からすべてのフィールドを取得し、送信されたパスワードと各一意のソルトをハッシュして、最後に各出力をハッシュされたものと比較する必要があるようです。テーブル内の文字列?

だから私はハッシュ(パスワード+ソルト)の組み合わせごとに別々のクエリを送信する必要がありますか?それはひどく遅いようです。プロセスをスピードアップするトリックがありませんか?それとも、単にそれを吸い上げて速度を犠牲にしてセキュリティを向上させるだけの問題ですか?それとも私は間違っていて、今日のコンピューターの速度ではそれはまったく問題ではありませんか?

4

1 に答える 1

1

パスワードのみに基づいてユーザーを認証することはできません。パスワードは、ユーザーが本人であることを確認するものであるため、何らかのユーザー識別子 (名前など) が必要です。テーブルは のようになり、そこから検証を進めますusers(..., name, password, ...)SELECT password WHERE name = "foo"便利な形式は、派生キーを生成するために必要なすべてのパラメーターをパスワード フィールド内に保持することです。たとえば、次のようになります。

algo$salt$password hash

ハッシュ自体については、高速である必要はありません — PBKDF2、bcrypt、scrypt などの鍵派生関数を参照してください。一般に、1 つのキーを導出するのに約 1 秒かかるようにパラメーターを調整することは、ブルート フォーシングを実行不可能にする良い方法です。

于 2012-04-14T07:00:52.337 に答える