18

学習用のユーザーログインシステムを作りたいです。いくつか質問があります。

いくつかの調査を行ったところ、ユーザー ログイン システムを実装する適切な方法は、ユーザー名/ID とパスワードの暗号化/ハッシュ バージョンをデータベースに格納することであることがわかりました。ユーザーがログインすると、パスワードはクライアント側 (MD5、SHA-1 など) で暗号化され、サーバーに送信されてデータベース内のパスワードと比較されます。それらが一致する場合、ユーザーは正常にログインします。

この実装により、DBA やプログラマーがデータベース内のパスワードの平文を見ることができなくなります。また、ハッカーが転送中に実際のパスワードを傍受するのを防ぐこともできます。

ここで私は混乱しています:

  1. ハッカーが (データベースをハッキングして) パスワードのハッシュ化/暗号化されたバージョンを知っている場合、または DBA は、データベース内のテキストを読み取るだけでパスワードのハッシュ化されたバージョンを取得します。次に、このハッシュ化されたバージョンのパスワードをサーバーに送信して、正常にログインできるようにするプログラムを簡単に作成できます。それができる場合、パスワードの暗号化はあまり役に立ちません。ここで何かを誤解していると思います。

  2. これ (上記で説明した方法) は、ユーザー ログイン機能を実装する最も一般的な方法ですか? 現在のベストプラクティスに従っていますか? すべてを手動で行う必要がありますか?それとも、同じことを行う機能が組み込まれているデータベースがありますか? ウェブサイトまたはウェブアプリでこれを行う最も一般的な方法/方法はありますか? もしそうなら、詳細を教えてください。

  3. 私の以前の会社では、couchDB を使用して、パスワードを含むユーザーのログイン情報を保存していました。彼らは物事の暗号化の側面についてはあまりやりませんでした. 彼らによると、couchDB は自動的にパスワードを暗号化し、ドキュメントに保存します。これが安全な方法かどうかはわかりません。もしそうなら、多くの作業を節約できるので、プログラマーにとってはかなり便利です。

  4. この方法 (ポイント 3) は、通常の使用に十分安全ですか? mySQL などの他のデータベース システムには、同じことを実行できるこの種の機能がありますか? もしそうなら、それは mySQL 組み込みメソッドを使用することは十分に安全であることを意味しますか?

ユーザーログイン機能を実装する非常に安全な方法を探しているわけではありません。私はむしろ、人気があり、実装が容易で、適切で、ほとんどの Web アプリケーションにとって十分に安全な方法を探しています。アドバイスをお願いします。提供された詳細は本当に高く評価されます。

4

2 に答える 2

16

ユーザーがログインすると、クライアント側のコードは MD5 や SHA-1 などでパスワードを暗号化し、この暗号化されたパスワードをサーバー側に送信して、データベース内のパスワードと比較します。それらが一致する場合、ユーザーは正常にログインします。

いいえ、いいえ、クライアントはハッシュ化されていないパスワードを送信する必要があります。クライアント側でパスワードをハッシュすると、そのハッシュが実質的にパスワードになります。これにより、暗号ハッシュのセキュリティが無効になります。ハッシュはサーバー側で行う必要があります。

転送中の平文パスワードを保護するには、暗号化された TLS (SSL) 接続などの安全なチャネルを介して送信する必要があります。


パスワードは、アカウントごとに異なる追加データでソルトする必要があります。ソルティングは、プレーンテキストとハッシュの間の直接的な相関関係を排除することで、レインボー テーブル攻撃を抑制します。ソルトは秘密にする必要はなく、極端に大きくする必要もありません。ランダムな 4 バイトのソルトでも、レインボー テーブル攻撃の複雑さは 40 億倍になります。


現在の業界のゴールド スタンダードはBcryptです。ソルティングに加えて、bcrypt は減速要因を設計することにより、さらなるセキュリティを追加します。

レインボー テーブル攻撃から保護するためにソルトを組み込むことに加えて、bcrypt は適応機能です。時間が経つにつれて、反復回数を増やして遅くすることができるため、計算能力が向上してもブルート フォース検索攻撃に対する耐性が維持されます。.暗号理論的には、これは標準の Blowfish 鍵スケジュールよりも強力ではありませんが、再鍵ラウンドの数は構成可能です。したがって、このプロセスは任意に遅くすることができ、ハッシュまたはソルトに対するブルート フォース攻撃を阻止するのに役立ちます。

于 2013-07-30T22:12:37.580 に答える
5

いくつかの説明:

  1. MD5 を使用しないでください。壊れていると考えられます。SHA を使用しますが、SHA1 よりも少し優れたものをお勧めします。- https://en.wikipedia.org/wiki/MD5
  2. パスワードのソルトについては何も言及していません。これは、Rainbow テーブルから保護するために不可欠です。- https://en.wikipedia.org/wiki/Rainbow_tables
  3. パスワードをソルティング/ハッシュするという考えは、実際には自分のアプリケーションを保護するためのものではありません。これは、ほとんどのユーザーが多数のサイトで使用するいくつかのパスワードを持っているためです。ハッシュ/ソルティングにより、データベースにアクセスした人がこれらのパスワードが何であるかを知り、それらを使用して銀行アプリケーションまたは同様のものにログインするのを防ぎます. 誰かがデータベースに直接アクセスできるようになると、アプリケーションのセキュリティはすでに完全に侵害されています。- http://nakedsecurity.sophos.com/2013/04/23/users-same-password-most-websites/
  4. ログインを処理するために、データベースの組み込みセキュリティを使用しないでください。それはハックであり、必要以上に多くのアプリケーション アクセスを彼らに与えてしまいます。テーブルを使用します。
  5. SSLについては何も言及していません。優れた設計の認証システムであっても、パスワードが平文で送信されると役に立ちません。チャレンジ/レスポンスのような他のアプローチもありますが、残念ながら、ユーザーがパスワードを登録または変更するときに、パスワードをプレーン テキストでサーバーに送信する必要があります。これを防ぐには、SSL が最適です。
于 2013-07-30T22:14:01.587 に答える