5522

モデレーター注:

この質問は、現在スタック オーバーフローに適用されている話題性ルールを使用した質問と回答の形式には適していません。通常、コンテンツがまだ価値があるような質問には「歴史的ロック」を使用します。ただし、この質問に対する回答は積極的に維持されており、履歴ロックにより回答を編集することはできません。そのため、回答を編集できるように「wiki 回答」ロックが適用されています。通常、履歴ロックによって処理される話題性の問題が存在すると想定する必要があります (つまり、この質問は、スタック オーバーフローのトピックに関する質問の良い例ではありません)。

Web サイトのフォームベース認証

スタック オーバーフローは、非常に具体的な技術的な質問のためのリソースであるだけでなく、一般的な問題のバリエーションを解決する方法に関する一般的なガイドラインでもあると考えています。「Web サイトのフォームベース認証」は、このような実験の優れたトピックです。

次のようなトピックを含める必要があります。

  • ログイン方法
  • ログアウトする方法
  • ログイン状態を維持する方法
  • Cookieの管理(推奨設定を含む)
  • SSL/HTTPS 暗号化
  • パスワードの保存方法
  • 秘密の質問の使用
  • ユーザー名/パスワードを忘れた機能
  • ナンスを使用してクロスサイト リクエスト フォージェリ (CSRF)を防止する
  • OpenID
  • 「私を覚えている」チェックボックス
  • ユーザー名とパスワードのブラウザのオートコンプリート
  • シークレット URL (ダイジェストで保護された公開URL )
  • パスワード強度の確認
  • 電子メールの検証
  • フォームベースの認証についてさらに詳しく...

次のようなものは含めないでください。

  • 役割と権限
  • HTTP 基本認証

次の方法で私たちを助けてください:

  1. サブトピックの提案
  2. このテーマに関する優れた記事を提出する
  3. 公式回答の編集
4

11 に答える 11

3903

パート I: ログイン方法

認証のためにサーバー側のスクリプトに値を POST する、ログインとパスワードの HTML フォームを作成する方法を既に知っていると仮定します。以下のセクションでは、健全で実用的な認証のパターンと、最も一般的なセキュリティの落とし穴を回避する方法について説明します。

HTTPS にするか、HTTPS にしないか?

接続がすでに保護されていない限り (つまり、SSL/TLS を使用して HTTPS を介してトンネリングされていない場合)、ログイン フォームの値はクリアテキストで送信されます。これにより、ブラウザーと Web サーバーの間の回線を盗聴した人は、通過するログインを読み取ることができます。終えた。この種の盗聴は政府によって日常的に行われていますが、一般的には、「所有されている」ワイヤについては、「HTTPS を使用してください」と言う以外には対処しません。

本質的に、ログイン中の盗聴/パケット スニッフィングから保護する唯一の実用的な方法は、HTTPS または別の証明書ベースの暗号化スキーム (たとえば、TLS )、または実証済みでテスト済みのチャレンジ/レスポンス スキーム (たとえば、Diffie-Hellmanベースの SRP)。他の方法は、盗聴攻撃者によって簡単に回避できます。

もちろん、少し非現実的になりたい場合は、何らかの形式の 2 要素認証スキームを採用することもできます (たとえば、Google Authenticator アプリ、物理的な「冷戦スタイル」のコードブック、または RSA キー ジェネレーター ドングル)。正しく適用されれば、セキュリティで保護されていない接続でも機能する可能性がありますが、開発者が SSL ではなく 2 要素認証を喜んで実装するとは想像しがたいです。

(しないでください) 独自の JavaScript 暗号化/ハッシュ化

Web サイトに SSL 証明書を設定するコストと技術的な難しさを考えると (現在は回避可能ですが)、一部の開発者は、セキュリティで保護されていないワイヤを介してクリアテキスト ログインを渡すことを回避するために、独自のブラウザー内ハッシュまたは暗号化スキームを展開するように誘惑されます。

これは高尚な考えですが、上記のいずれか、つまり、強力な暗号化で回線を保護するか、実証済みのチャレンジ/レスポンスを使用することのいずれかと組み合わせない限り、本質的に役に立ちません (また、セキュリティ上の欠陥になる可能性があります)。 (それが何であるかわからない場合は、証明するのが最も難しく、設計が最も難しく、デジタル セキュリティの概念を実装するのが最も難しいものの 1 つであることを知っておいてください)。

パスワードのハッシュ化がパスワードの開示に対して効果的であることは事実ですが、リプレイ攻撃、中間者攻撃/ハイジャックに対して脆弱です (攻撃者がセキュリティで保護されていない HTML ページに到達する前に数バイトを挿入できる場合)。 JavaScript のハッシュをコメント アウトするだけです)、またはブルート フォース攻撃 (攻撃者にユーザー名、salt、およびハッシュ化されたパスワードの両方を渡しているため)。

人道に対するCAPTCHAS

CAPTCHAは、特定のカテゴリの攻撃を阻止することを目的としています。それは、人間のオペレーターがいない、自動化された辞書/ブルート フォースの試行錯誤です。これが本当の脅威であることは間違いありませんが、CAPTCHA を必要とせずにシームレスに対処する方法、特に適切に設計されたサーバー側のログイン スロットリング スキームがあります。これらについては後で説明します。

CAPTCHA の実装は同じようには作成されないことに注意してください。多くの場合、人間が解決することはできず、実際にはほとんどがボットに対して効果がなく、すべてが安価な第三世界の労働力に対して効果がありません ( OWASPによると、現在のスウェットショップ率は 500 テストあたり 12 ドルです)。一部の国では技術的に違法です ( OWASP Authentication Cheat Sheetを参照)。CAPTCHA を使用する必要がある場合は、Google のreCAPTCHAを使用してください。これは、定義上 OCR が難しく (既に OCR で誤って分類された書籍のスキャンを使用しているため)、ユーザーフレンドリーになるように非常に努力しているためです。

個人的には、私は CAPTCHAS が煩わしいと感じる傾向があり、ユーザーが何度もログインに失敗し、スロットリングの遅延が限界に達した場合の最後の手段としてのみ使用します。これは、許容できるほどめったに発生せず、システム全体を強化します。

パスワードの保存 / ログインの確認

これは、ここ数年で大々的に報道されたハッキン​​グやユーザー データの漏えいにより、ようやく一般に知られるようになったかもしれませんが、データベースにパスワードを平文で保存しないでください。ユーザー データベースは、SQL インジェクションによって日常的にハッキング、リーク、または収集されます。未加工の平文のパスワードを保存している場合、ログイン セキュリティは即座にゲーム オーバーになります。

パスワードを保存できない場合、ログイン フォームから POST されたログインとパスワードの組み合わせが正しいことを確認するにはどうすればよいでしょうか。答えは、キー派生関数を使用したハッシュです。新しいユーザーが作成されるか、パスワードが変更されるたびに、パスワードを取得し、Argon2、bcrypt、scrypt、または PBKDF2 などの KDF を介して実行し、クリアテキストのパスワード (「correcthorsebatterystaple」) を長いランダムに見える文字列に変換します。これは、データベースに保存する方がはるかに安全です。ログインを確認するには、入力したパスワードに対して同じハッシュ関数を実行します。今回はソルトを渡し、結果のハッシュ文字列をデータベースに保存されている値と比較します。Argon2、bcrypt、および scrypt は、ハッシュとともにソルトを保存します。詳細については、sec.stackexchange に関するこの記事を参照してください。

ソルトが使用される理由は、ハッシュ自体が十分でないためです。レインボー テーブルからハッシュを保護するために、いわゆる「ソルト」を追加する必要があります。ソルトは、正確に一致する 2 つのパスワードが同じハッシュ値として保存されるのを効果的に防ぎ、攻撃者がパスワード推測攻撃を実行している場合にデータベース全体が 1 回の実行でスキャンされるのを防ぎます。

ユーザーが選択したパスワードは十分な強度がなく (つまり、通常、十分なエントロピーが含まれていない)、パスワード推測攻撃は、ハッシュにアクセスできる攻撃者によって比較的短時間で完了する可能性があるため、暗号化ハッシュをパスワード ストレージに使用しないでください。これが KDF が使用される理由です。これらは効果的に「キーをストレッチ」します。つまり、攻撃者がパスワードを推測するたびに、ハッシュ アルゴリズムが複数回 (たとえば 10,000 回) 繰り返され、攻撃者がパスワードを推測する速度が 10,000 倍遅くなります。

セッション データ - 「Spiderman69 としてログインしています」

サーバーがユーザー データベースに対してログインとパスワードを検証し、一致するものを見つけたら、システムにはブラウザーが認証されたことを記憶する方法が必要です。この事実は、サーバー側のセッション データにのみ保存する必要があります。

セッション データに慣れていない場合は、次のように動作します。ランダムに生成された単一の文字列が期限切れの Cookie に格納され、サーバーに格納されているデータのコレクション (セッション データ) を参照するために使用されます。MVC フレームワークを使用している場合、これは間違いなく既に処理されています。

可能な限り、セッション Cookie がブラウザーに送信されるときに、セキュアおよび HTTP のみのフラグが設定されていることを確認してください。HttpOnly フラグは、XSS 攻撃によって読み取られる Cookie に対する保護を提供します。secure フラグは、Cookie が HTTPS 経由でのみ送り返されることを保証するため、ネットワーク スニッフィング攻撃から保護します。Cookie の値は予測可能であってはなりません。存在しないセッションを参照する Cookie が提示された場合、セッションの固定化を防ぐために、その値をすぐに置き換える必要があります。

セッション状態は、クライアント側でも維持できます。これは、JWT (JSON Web Token) などの手法を使用して実現されます。

パート II: ログイン状態を維持する方法 - 悪名高い "Remember Me" チェックボックス

永続的なログイン Cookie (「記憶」機能) は危険ゾーンです。一方では、ユーザーがそれらの処理方法を理解していれば、従来のログインとまったく同じくらい安全です。その一方で、不注意なユーザーが公共のコンピューターで使用してログアウトするのを忘れたり、ブラウザーの Cookie とは何か、またはそれらを削除する方法を知らない可能性があるため、これらは非常に大きなセキュリティ リスクとなります。

個人的には、定期的にアクセスする Web サイトへの永続的なログインが好きですが、それらを安全に処理する方法を知っています。ユーザーが同じことを知っていると確信している場合は、良心的に永続的なログインを使用できます。そうでない場合は、ログイン資格情報を不注意に使用しているユーザーがハッキングされた場合に自分自身でそれをもたらしたという哲学に同意することができます. ユーザーの家に行って、モニターの端に並べられたパスワード付きの手のひらを誘発する付箋をすべて破るわけでもありません。

もちろん、システムによっては、アカウントをハッキングする余裕がないものもあります。そのようなシステムでは、永続的なログインを正当化する方法はありません。

永続的なログイン Cookie を実装することに決めた場合は、次のようにします。

  1. まず、このテーマに関するParagon Initiative の記事を読んでください。一連の要素を正しく理解する必要がありますが、この記事ではそれぞれの要素をうまく説明しています。

  2. 最も一般的な落とし穴の 1 つを繰り返しますが、永続的なログイン Cookie (トークン) をデータベースに保存しないでください。ハッシュのみを保存してください。ログイン トークンはパスワードと同等であるため、攻撃者がデータベースを手に入れた場合、平文のログイン パスワードの組み合わせであるかのように、トークンを使用して任意のアカウントにログインできます。したがって、永続的なログイン トークンを保存する場合は、ハッシュを使用します ( https://security.stackexchange.com/a/63438/5002によると、この目的には弱いハッシュでも問題ありません)。

パート III: 秘密の質問の使用

「秘密の質問」を実装しないでください。「秘密の質問」機能は、セキュリティのアンチパターンです。MUST-READ リストのリンク番号 4 から論文を読んでください。彼女の Yahoo! 彼女の秘密の質問への答えが「ワシラ高校」だったため、以前の大統領選挙中にメールアカウントがハッキングされました!

ユーザー指定の質問であっても、ほとんどのユーザーは次のいずれかを選択する可能性が非常に高くなります。

  • 母親の旧姓や好きなペットなどの「標準的な」秘密の質問

  • 誰でも自分のブログや LinkedIn のプロフィールなどから取り上げることができる簡単なトリビア

  • パスワードを推測するよりも答えやすい質問。まともなパスワードの場合、どれが想像できるすべての質問です

結論として、セキュリティの質問は、事実上すべての形式とバリエーションで本質的に安全ではないため、何らかの理由で認証方式に使用するべきではありません。

セキュリティに関する質問が広まっている本当の理由は、電子メールにアクセスできないユーザーからの数回のサポート コールのコストを便利に節約できるためです。これは、セキュリティとサラ ペイリンの評判を犠牲にして行われました。価値がある?おそらくそうではありません。

パート IV: パスワードを忘れた場合の機能

忘れた/紛失したユーザーパスワードを処理するためにセキュリティの質問を使用してはならない理由については、既に説明しました。言うまでもなく、ユーザーに実際のパスワードを電子メールで送信してはいけません。この分野で避けるべき、あまりにも一般的な落とし穴が少なくともあと 2 つあります。

  1. 忘れたパスワードを自動生成された強力なパスワードにリセットしないでください。このようなパスワードは覚えにくいことで有名です。つまり、ユーザーはパスワードを変更するか、モニターの端にある明るい黄色のポストイットなどに書き留めておく必要があります。新しいパスワードを設定する代わりに、ユーザーがすぐに新しいパスワードを選択できるようにします。これはとにかくやりたいことです。(これに対する例外は、ユーザーが一般的にパスワード マネージャーを使用して、通常は書き留めないと覚えられないパスワードを保存/管理している場合です)。

  2. データベース内の失われたパスワード コード/トークンを常にハッシュします。繰り返しますが、このコードは同等のパスワードの別の例であるため、攻撃者がデータベースを手に入れた場合に備えてハッシュする必要があります。紛失したパスワード コードが要求されたら、平文のコードをユーザーのメール アドレスに送信し、それをハッシュして、ハッシュをデータベースに保存し、の を破棄します。パスワードや永続的なログイン トークンと同様です。

最後の注意: 「失われたパスワード コード」を入力するためのインターフェイスが、少なくともログイン フォーム自体と同じくらい安全であることを常に確認してください。非常に長い「失われたパスワード コード」 (たとえば、大文字と小文字を区別する 16 文字の英数字) を生成することを確認することは良い出発点ですが、ログイン フォーム自体に対して行うのと同じスロットリング スキームを追加することを検討してください。

パート V: パスワード強度の確認

まず、現実を確認するために、次の小さな記事をお読みください: The 500 most common passwords

さて、このリストは、どこのシステムで最も一般的なパスワードの標準的なリストではないかもしれませんが、強制的なポリシーがない場合、人々がパスワードをどれだけうまく選択しないかを示す良い指標です. さらに、最近盗まれたパスワードの一般公開されている分析と比較すると、リストは驚くほど身近に見えます。

したがって、パスワード強度の最小要件がないため、ユーザーの 2% が最も一般的な上位 20 個のパスワードのいずれかを使用しています。つまり、攻撃者が 20 回試行しただけで、Web サイトの 50 分の 1 のアカウントがクラック可能になります。

これを阻止するには、パスワードのエントロピーを計算してから、しきい値を適用する必要があります。米国国立標準技術研究所 (NIST)のSpecial Publication 800-63には、一連の非常に優れた提案があります。これを辞書とキーボード レイアウトの分析 (たとえば、「qwertyuiop」は不適切なパスワード) と組み合わせると、不適切に選択されたすべてのパスワードの 99%を 18 ビットのエントロピーのレベルで拒否できます。パスワードの強度を計算し、視覚強度メーターをユーザーに表示するだけでも十分ですが、不十分です。強制されない限り、多くのユーザーはそれを無視するでしょう。

また、エントロピーの高いパスワードの使いやすさを一新するために、Randall Munroe のPassword Strength xkcdを強くお勧めします。

Troy Hunt のHave I Been Pwned APIを利用して、ユーザーのパスワードと公開データ侵害で侵害されたパスワードを照合します。

パート VI: その他 - または: 連射ログイン試行の防止

まず、数値を見てみましょう:パスワード回復速度 - パスワードが有効になる時間

そのリンクの表を確認する時間がない場合は、次のリストを参照してください。

  1. そろばんで解読しても、脆弱なパスワードを解読するのにほとんど時間はかかりません

  2. 大文字と小文字が区別されない場合、英数字 9 文字のパスワードを解読するのにほとんど時間がかかりません

  3. 複雑な記号と文字と数字の大文字と小文字のパスワードを8 文字未満で解読するのに、ほとんど時間はかかりません(デスクトップ PC は、問題で最大 7 文字までのキースペース全体を検索できます)。数日または数時間)

  4. ただし、 1 秒間に 1 回の試行に制限されていると、6 文字のパスワードを解読するのに非常に長い時間がかかります。

では、これらの数字から何を学べるでしょうか。まあ、たくさんありますが、最も重要な部分に焦点を当てることができます: 大量の連続した連射ログイン試行 (ブルート フォース攻撃) を防ぐことはそれほど難しくないという事実です。しかし、それを正しく防ぐことは、思ったほど簡単ではありません。

一般的に言えば、ブルート フォース攻撃(および辞書攻撃ですが、既に強力なパスワード ポリシーを採用しているため、これらは問題にはなりません)に対してすべて効果的な 3 つの選択肢があります。

  • N 回失敗した後にCAPTCHAを表示します (非常に面倒で、効果がないことが多いですが、ここで繰り返します)。

  • アカウントをロックし、N 回失敗した後に電子メールの確認を要求する (これは発生するのを待っているDoS攻撃です)

  • そして最後に、ログインスロットリング: つまり、N 回失敗した後の試行間に時間遅延を設定します (はい、DoS 攻撃は依然として可能ですが、少なくとも可能性ははるかに低く、実行するのははるかに複雑です)。

ベスト プラクティス #1: 次のように、失敗した試行の数に応じて増加する短い時間の遅延:

  • 1 回失敗 = 遅延なし
  • 2 回失敗 = 2 秒の遅延
  • 3 回失敗 = 4 秒の遅延
  • 4 回失敗 = 8 秒の遅延
  • 5 回失敗 = 16 秒の遅延

結果として生じるロックアウト時間は、以前のロックアウト時間の合計よりもわずかに長くなるため、このスキームを攻撃する DoS は非常に非現実的です。

明確にするために: 遅延は、ブラウザーに応答を返す前の遅延ではありません。これは、特定のアカウントまたは特定の IP アドレスからのログイン試行がまったく受け入れられない、またはまったく評価されない、タイムアウトまたは不応期のようなものです。つまり、ログインが成功しても正しい資格情報は返されず、誤った資格情報によって遅延が増加することはありません。

ベスト プラクティス #2: 次のように、N 回の試行が失敗した後に有効になる中程度の長さの遅延時間:

  • 1 ~ 4 回の失敗 = 遅延なし
  • 試行に 5 回失敗 = 15 ~ 30 分の遅延

このスキームを攻撃する DoS は非常に非現実的ですが、確実に実行可能です。また、このような長い遅延は、正当なユーザーにとって非常に迷惑になる可能性があることに注意してください。忘れっぽいユーザーはあなたを嫌うでしょう。

ベスト プラクティス #3: 2 つのアプローチを組み合わせます。

  • 1 ~ 4 回の失敗 = 遅延なし
  • 5 回以上試行に失敗 = 20 秒の遅延

または、次のように、上限が固定された遅延の増加:

  • 1 回失敗 = 5 秒の遅延
  • 2 回失敗 = 15 秒の遅延
  • 3 回以上の失敗 = 45 秒の遅延

この最終的なスキームは、OWASP のベスト プラクティスの提案 (MUST-READ リストのリンク 1) から取られたものであり、制限的な側面が認められたとしても、ベスト プラクティスと見なされるべきです。

ただし、経験則として、パスワード ポリシーが強力であればあるほど、遅延でユーザーを悩ませる必要が少なくなります。強力な (大文字と小文字を区別する英数字 + 必要な数字と記号) 9 文字以上のパスワードが必要な場合は、スロットリングを有効にする前に、遅延のないパスワードの試行をユーザーに 2 ~ 4 回与えることができます。

この最終的なログイン スロットリング スキームを攻撃する DoS 攻撃は、非常に現実的ではありません。そして最後の仕上げとして、永続的な (Cookie) ログイン (および/または CAPTCHA で検証されたログイン フォーム) の通過を常に許可することで、正当なユーザーが攻撃の進行中に遅延することさえありません。そうすれば、非常に非現実的な DoS 攻撃が、非常に非現実的な攻撃になります。

さらに、管理者アカウントは最も魅力的なエントリ ポイントであるため、管理者アカウントに対してより積極的な調整を行うことは理にかなっています。

パート VII: 分散型ブルート フォース攻撃

余談ですが、より高度な攻撃者は、「活動を広げる」ことでログイン スロットリングを回避しようとします。

  • ボットネットで試行を分散して IP アドレスのフラグ付けを防止する

  • 1 人のユーザーを選んで 50.000 の最も一般的なパスワードを試すのではなく (私たちのスロットリングのためにそれはできません)、彼らは最も一般的なパスワードを選び、代わりに 50.000 のユーザーに対して試します。そうすれば、CAPTCHA やログイン スロットリングなどの最大試行回数対策を回避できるだけでなく、成功の可能性も高まります。

  • ユーザー アカウントごとにログイン リクエストを間隔をあけて (たとえば 30 秒間隔で) レーダーの下に忍び込ませる

ここでのベスト プラクティスは、システム全体で失敗したログインの数をログに記録し、すべてのユーザーに課す上限の基礎としてサイトの不正ログイン頻度の移動平均を使用することです。

抽象的すぎる?言い換えてみましょう:

あなたのサイトでは、過去 3 か月間、1 日あたり平均 120 回の不正なログインがあったとします。それ(移動平均)を使用すると、システムはグローバル制限をその3倍に設定する可能性があります。24 時間で 360 回の失敗。次に、すべてのアカウントで失敗した試行の合計数が 1 日以内にその数を超えた場合 (または、加速率を監視し、計算されたしきい値でトリガーした場合)、システム全体のログイン スロットリングがアクティブになります。つまり、すべてのユーザーに対して短い遅延が発生します。 (ただし、Cookie ログインおよび/またはバックアップ CAPTCHA ログインを除く)。

また、分散型ブルート フォース攻撃をかわす際のトリッキーな落とし穴を回避する方法について、より詳細な質問と非常に良い議論を投稿しました。

パート VIII: 二要素認証と認証プロバイダー

エクスプロイト、パスワードの書き留めや紛失、鍵付きのラップトップの盗難、ユーザーによるフィッシング サイトへのログインなどによって、資格情報が侵害される可能性があります。ログインは、通話、SMS メッセージ、アプリ、またはドングルから受信した使い捨てコードなどの帯域外要素を使用する 2 要素認証でさらに保護できます。複数のプロバイダーが 2 要素認証サービスを提供しています。

認証は、別のプロバイダーが資格情報の収集を処理するシングル サインオン サービスに完全に委任できます。これにより、信頼できるサードパーティに問題がプッシュされます。Google と Twitter はどちらも標準ベースの SSO サービスを提供していますが、Facebook は同様の独自ソリューションを提供しています。

必読のリンク Web 認証について

  1. 認証の OWASP ガイド/ OWASP 認証チート シート
  2. Web でのクライアント認証のすべきこととすべきでないこと (非常に読みやすい MIT の研究論文)
  3. ウィキペディア: HTTP クッキー
  4. フォールバック認証のための個人的な知識の質問: Facebook の時代におけるセキュリティの質問 (非常に読みやすいバークレーの研究論文)
于 2009-01-25T11:27:46.093 に答える
430

決定的な記事

資格情報の送信

資格情報を 100% 安全に送信する唯一の実用的な方法は、SSLを使用することです。JavaScript を使用してパスワードをハッシュすることは安全ではありません。クライアント側のパスワード ハッシュに関する一般的な落とし穴:

  • クライアントとサーバー間の接続が暗号化されていない場合、すべての操作が中間者攻撃に対して脆弱になります。攻撃者は、受信した JavaScript を置き換えてハッシュを壊したり、すべての資格情報をサーバーに送信したり、クライアントの応答をリッスンしてユーザーを完全に偽装したりできます。信頼できる認証局による SSL は、MitM 攻撃を防ぐように設計されています。
  • サーバーで追加の冗長な作業を行わないと、サーバーが受け取るハッシュ化されたパスワードの安全性が低下します。

SRPと呼ばれる別の安全な方法がありますが、特許を取得しており (ただし、ライセンスは自由に使用できます)、適切な実装はほとんどありません。

パスワードの保存

パスワードをプレーンテキストとしてデータベースに保存しないでください。自分のサイトのセキュリティを気にしなくても構いません。一部のユーザーがオンライン銀行口座のパスワードを再利用するとします。したがって、ハッシュ化されたパスワードを保存し、元のパスワードは破棄してください。また、パスワードがアクセス ログやアプリケーション ログに表示されないようにしてください。OWASPは、新しいアプリケーションの最初の選択肢としてArgon2 の使用を推奨しています。これが利用できない場合は、代わりに PBKDF2 または scrypt を使用する必要があります。最後に、上記のいずれも利用できない場合は、bcrypt を使用します。

ハッシュ自体も安全ではありません。たとえば、同一のパスワードは同一のハッシュを意味します。これにより、ハッシュ ルックアップ テーブルは一度に多数のパスワードを解読する効果的な方法になります。代わりに、saltedハッシュを保存します。ソルトは、ハッシュする前にパスワードに追加される文字列です。ユーザーごとに異なる (ランダムな) ソルトを使用します。ソルトは公開値であるため、ハッシュとともにデータベースに保存できます。詳細については、こちらを参照してください。

これは、忘れたパスワードをユーザーに送信できないことを意味します (ハッシュしか持っていないため)。ユーザーを認証していない限り、ユーザーのパスワードをリセットしないでください (ユーザーは、保存された (および検証された) メールアドレスに送信されたメールを読むことができることを証明する必要があります)。

セキュリティの質問

セキュリティの質問は安全ではありません。使用しないでください。なんで?セキュリティの質問が何をするにしても、パスワードの方が効果的です。PART III: Using Secret Questions in @Jens Roland answer here in this wikiを読んでください。

セッション クッキー

ユーザーがログインすると、サーバーはユーザーにセッション Cookie を送信します。サーバーは Cookie からユーザー名または ID を取得できますが、他の誰もそのような Cookie を生成することはできません (TODO 説明メカニズム)。

Cookie はハイジャックされる可能性があります。Cookieは、クライアントのマシンの残りの部分やその他の通信と同じくらい安全です。ディスクから読み取ったり、ネットワーク トラフィックを傍受したり、クロスサイト スクリプティング攻撃によって持ち上げたり、汚染された DNS からフィッシングしたりして、クライアントが Cookie を間違ったサーバーに送信する可能性があります。永続的な Cookie を送信しないでください。Cookie は、クライアント セッションの最後 (ブラウザーを閉じるか、ドメインを離れる) に失効する必要があります。

ユーザーを自動ログインさせたい場合は、永続的な Cookie を設定できますが、フルセッション Cookie とは区別する必要があります。ユーザーが自動ログインし、機密性の高い操作のために実際にログインする必要があるという追加のフラグを設定できます。これは、シームレスでパーソナライズされたショッピング体験を提供しながら、財務情報を保護したいショッピング サイトで人気があります。たとえば、Amazon に再度アクセスすると、ログインしているように見えるページが表示されますが、注文する (または配送先住所やクレジット カードなどを変更する) と、確認を求められます。あなたのパスワード。

一方、銀行やクレジット カードなどの金融 Web サイトには機密データのみが含まれており、自動ログインや低セキュリティ モードを許可するべきではありません。

外部リソースのリスト

于 2008-08-02T20:40:45.533 に答える
168

まず、この回答がこの正確な質問に最適ではないという強い警告があります。それは間違いなく最高の答えであってはなりません!

将来の認証へのより良いアプローチへのアップグレード パスを見つけるという精神で、Mozilla が提案しているBrowserID (または、より正確にはVerified Email Protocol ) について言及します。

私はそれを次のように要約します:

  1. Mozilla は、この問題に対する優れた解決策を見つけることと一致する価値観を持つ非営利団体です。
  2. 今日の現実は、ほとんどの Web サイトがフォームベースの認証を使用していることです。
  3. フォームベースの認証には、フィッシングのリスクが高まるという大きな欠点があります。ユーザーは、ユーザー エージェント (ブラウザー) によって制御される領域ではなく、リモート エンティティによって制御される領域に機密情報を入力するよう求められます。
  4. ブラウザーは暗黙的に信頼されているため (ユーザー エージェントの全体的な考え方は、ユーザーに代わって動作することです)、この状況を改善するのに役立ちます。
  5. ここで進行を妨げている主な要因は、デプロイメントのデッドロックです。ソリューションは、それ自体でいくつかの増分利益を提供するステップに分解する必要があります。
  6. インターネット インフラストラクチャに組み込まれている ID を表現するための最も単純な分散型の方法は、ドメイン名です。
  7. アイデンティティを表現する 2 番目のレベルとして、各ドメインは独自のアカウント セットを管理します。
  8. 「アカウント@ドメイン」という形式は簡潔で、幅広いプロトコルと URI スキームでサポートされています。もちろん、そのような識別子は、電子メールアドレスとして広く認識されています。
  9. 電子メール プロバイダーは、オンラインでの事実上の主要な ID プロバイダーです。現在のパスワード リセット フローでは、通常、アカウントに関連付けられた電子メール アドレスを管理していることを証明できれば、アカウントを管理できます。
  10. 検証済み電子メール プロトコルは、ドメイン A にアカウントがあることをドメイン B に証明するプロセスを合理化するために、公開鍵暗号に基づく安全な方法を提供するために提案されました。
  11. Verified Email Protocol をサポートしていないブラウザ (現在はすべて) のために、Mozilla は、クライアント側の JavaScript コードでプロトコルを実装する shim を提供しています。
  12. 検証済み電子メール プロトコルをサポートしていない電子メール サービスの場合、このプロトコルにより、サード パーティは信頼できる仲介者として機能し、ユーザーのアカウントの所有権を検証したことを主張できます。そのような第三者が多数存在することは望ましくありません。この機能は、アップグレード パスを許可することのみを目的としており、電子メール サービスがこれらのアサーション自体を提供することを強くお勧めします。
  13. Mozilla は、そのような信頼できるサードパーティのように振る舞う独自のサービスを提供しています。Verified Email Protocol を実装するサービス プロバイダ (つまり、依拠当事者) は、Mozilla のアサーションを信頼するかどうかを選択できます。Mozilla のサービスは、確認リンクを含む電子メールを送信する従来の手段を使用して、ユーザーのアカウントの所有権を確認します。
  14. もちろん、サービス プロバイダは、提供したい他の認証方法に加えて、このプロトコルをオプションとして提供することもできます。
  15. ここで求められているユーザー インターフェイスの大きな利点は、「ID セレクター」です。ユーザーがサイトにアクセスして認証を選択すると、ブラウザには、サイトで自分自身を識別するために使用できる電子メール アドレス (「個人」、「仕事」、「政治活動」など) の選択が表示されます。
  16. この取り組みの一環として求められているユーザー インターフェイスのもう 1 つの大きな利点は、ブラウザーがユーザーのセッション(主に、現在誰がサインインしているか) についてより多くの情報を把握できるようにすることです。これにより、ブラウザーのクロムに表示される可能性があります。
  17. このシステムは分散型であるため、Facebook、Twitter、Google などの主要なサイトへのロックインを回避できます。どの個人も独自のドメインを所有できるため、独自の ID プロバイダーとして機能できます。

これは厳密には「Web サイトのフォームベース認証」ではありません。しかし、これは現在のフォームベースの認証から、より安全なもの、つまりブラウザーがサポートする認証に移行するための努力です。

于 2011-08-08T15:32:34.210 に答える
149

うまく機能していることがわかったこのソリューションを共有したいと思いました。

私はこれをダミー フィールドと呼んでいます(ただし、私はこれを発明したわけではないので、信用しないでください)。

要するに、これをあなたに挿入<form>し、検証時に空であることを確認するだけです:

<input type="text" name="email" style="display:none" />

秘訣は、ボットをだまして、必須フィールドにデータを挿入する必要があると思わせることです。そのため、入力を「email」と名付けました。使用している email というフィールドが既にある場合は、ダミー フィールドに「company」、「phone」、「emailaddress」などの別の名前を付けてみてください。必要ないとわかっているものと、人々が通常 Web フォームに入力するのが理にかなっていると思われるものを選択するだけです。ここで、 inputCSS または JavaScript/jQuery を使用してフィールドを非表示にします (最も適したものを使用してください) 。入力を設定しないでください。そうしないと、ボットはそれに陥りません。typehidden

フォーム (クライアント側またはサーバー側) を検証するときは、ダミー フィールドが入力されているかどうかを確認して、人間またはボットによって送信されたかどうかを判断します。

例:

人間の場合: ユーザーにはダミー フィールド (私の場合は「email」という名前) が表示されず、入力しようとしません。そのため、フォームが送信されたとき、ダミー フィールドの値は空のままである必要があります。

ボットの場合:ボットは、タイプが であるフィールドとtext名前email(または名前が何であれ) を認識し、適切なデータを論理的に入力しようとします。派手な CSS で入力フォームのスタイルを設定したかどうかは気にしません。Web 開発者は常にそれを行っています。0ダミー フィールドの値が何であれ、それが文字数よりも大きい限り、気にしません。

私はゲストブックでこの方法をCAPTCHAと組み合わせて使用​​しましたが、それ以来、スパム投稿を 1 つも見たことがありません。以前は CAPTCHA のみのソリューションを使用していましたが、最終的には 1 時間に約 5 件のスパム投稿が発生しました。フォームにダミー フィールドを追加すると、(少なくとも今までは) すべてのスパムが表示されなくなりました。

これは、ログイン/認証フォームでも問題なく使用できると思います。

警告: もちろん、この方法は 100% 誰にでもできるわけではありません。display:noneボットは、スタイルが適用された入力フィールドを無視するようにプログラムできます。また、何らかの形式のオートコンプリート (ほとんどのブラウザーに組み込まれているように!) を使用して、すべてのフォーム フィールドに自動入力する人々についても考慮する必要があります。彼らはダミーフィールドを拾うかもしれません。

ダミー フィールドを画面の境界の外に表示したままにすることで、これを少し変えることもできますが、これは完全にあなた次第です。

クリエイティブに!

于 2012-05-22T12:11:20.310 に答える
87

上記の答えは「間違っている」とは思いませんが、触れられていない認証の領域がたくさんあります(つまり、「利用可能なオプションとトレードは何か」ではなく、「Cookieセッションの実装方法」に重点が置かれています。 -オフ」。

私の提案する編集/回答は

  • 問題は、パスワードチェックよりもアカウント設定にあります。
  • 二要素認証の使用は、パスワード暗号化のより巧妙な手段よりもはるかに安全です
  • 独自のログインフォームやパスワードのデータベースストレージを実装しようとしないでください。ただし、保存されているデータがアカウントの作成時に価値がなく、自己生成されている場合を除きます(つまり、FacebookやFlickrなどのWeb 2.0スタイル)。

    1. ダイジェスト認証は、すべての主要なブラウザとサーバーでサポートされている標準ベースのアプローチであり、セキュリティで保護されたチャネルを介してもパスワードを送信しません。

これにより、ブラウザ自体が毎回通信を再暗号化するため、「セッション」やCookieを設定する必要がなくなります。これは、最も「軽量」な開発アプローチです。

ただし、公共の低価値サービスを除いて、これはお勧めしません。これは、上記の他の回答のいくつかに関する問題です。サーバー側の認証メカニズムを再実装しないでください。この問題は解決されており、ほとんどの主要なブラウザーでサポートされています。クッキーは使用しないでください。自分の手巻きデータベースには何も保存しないでください。リクエストごとに、リクエストが認証されているかどうかを尋ねるだけです。他のすべては、構成とサードパーティの信頼できるソフトウェアによってサポートされている必要があります。

それで ...

まず、(パスワードを使用した)アカウントの最初の作成と、その後のパスワードの再チェックを混同しています。私がFlickrで、初めてサイトを作成する場合、新しいユーザーはゼロ値(空白のWebスペース)にアクセスできます。アカウントを作成している人が自分の名前について嘘をついているかどうかは本当に気にしません。病院のイントラネット/エクストラネットのアカウントを作成する場合、その値はすべての医療記録にあるため、アカウント作成者のID(*)を気にします

これは非常に難しい部分です。唯一のまともな解決策は信頼の網です。たとえば、あなたは医者として病院に参加します。写真、パスポート番号、公開鍵を使用してどこかでホストされるWebページを作成し、それらすべてを秘密鍵でハッシュします。次に病院に行き、システム管理者がパスポートを見て、写真があなたと一致するかどうかを確認し、病院の秘密鍵を使用してWebページ/写真のハッシュをハッシュします。これからは、キーとトークンを安全に交換できます。病院を信頼する人なら誰でもできるように(秘密のソースがあります)。システム管理者は、RSAドングルまたはその他の2要素認証を提供することもできます。

しかし、これは非常に面倒であり、Web2.0ではありませんただし、これは、自己作成されていない貴重な情報にアクセスできる新しいアカウントを作成するための唯一の安全な方法です。

  1. KerberosとSPNEGO(信頼できるサードパーティによるシングルサインオンメカニズム)は、基本的にユーザーが信頼できるサードパーティに対して検証します。(注:これは決して信頼されないOAuthではありません)

  2. SRP-信頼できるサードパーティを使用しない、一種の巧妙なパスワード認証。しかし、ここでは、「コストがかかる場合でも、2要素認証を使用する方が安全です」という領域に入り込んでいます。

  3. SSLクライアント側-クライアントに公開鍵証明書を提供します(すべての主要なブラウザーでサポートされますが、クライアントマシンのセキュリティについて疑問が生じます)。

結局のところ、これはトレードオフです。セキュリティ違反のコストと、より安全なアプローチを実装するためのコストはどれくらいですか。ある日、適切なPKIが広く受け入れられ、独自のロール認証フォームやデータベースがなくなる可能性があります。いつか...

于 2011-08-08T16:29:10.103 に答える
59

ハッシュするときは、MD5 などの高速ハッシュ アルゴリズムを使用しないでください (多くのハードウェア実装が存在します)。SHA-512 などを使用します。パスワードの場合は、ハッシュが遅いほど優れています。

ハッシュの作成が高速になればなるほど、ブルート フォース チェッカーの動作も高速になります。したがって、ハッシュが遅いほど、総当たり攻撃が遅くなります。低速のハッシュ アルゴリズムでは、より長いパスワード (8 桁以上) のブルート フォースが非現実的になります。

于 2011-08-08T23:07:08.973 に答える
56

認証システムに関する私のお気に入りのルールは、パスワードではなくパスフレーズを使用することです。覚えやすく、クラックするのは難しい。詳細:コーディング ホラー: パスワード vs. パス フレーズ

于 2012-11-24T21:15:52.187 に答える
19

非常に重要なコメントを1つ追加したいと思います: -

  • 企業の イントラネット設定では」、前述のすべてではないにしても、ほとんどが当てはまらない可能性があります。

多くの企業は、たまたま URL を介して実装された、事実上の「企業アプリケーション」である「内部使用のみ」の Web サイトを展開しています。これらの URL は(おそらく...)「会社の内部ネットワーク」内でのみ解決できます。(このネットワークには、VPN に接続されたすべての「ロード ウォリアー」が魔法のように含まれています。)

ユーザーが前述のネットワークに忠実に接続されている場合、ユーザーの身元(「認証」)は [既に ...] 「決定的に知られている」ものであり、特定のことを行うための許可(「承認」)は ... などです。 .. 「このウェブサイトにアクセスするには」

この「認証 + 承認」サービスは、LDAP (Microsoft OpenDirectory)や Kerberosなど、いくつかの異なるテクノロジによって提供できます。

あなたの観点からは、あなたは単にこれを知っています:あなたの Web サイトに合法的にたどり着いた人は誰でも[魔法のように含まれる環境変数 ...] 「トークン」を伴う必要があるということです。(つまり、そのようなトークンがないことは、 の即時の根拠でなければなりません404 Not Found。)

トークンの価値はあなたには意味がありません、必要が生じた場合、あなたのウェブサイトが「(LDAP ...など)を知っている人に[正式に]尋ねる」ことができる「適切な手段が存在する」必要があります(!)あなたが持つかもしれない質問。言い換えれば、「自家製のロジック」を利用することはできません。代わりに、当局に問い合わせて、その評決を暗黙のうちに信頼します。

ええと... 「ワイルドでウーリーなインターネット」からのかなりの精神的スイッチです。

于 2015-04-29T01:06:29.373 に答える
9

OpenID ConnectまたはUser-Managed Accessを使用します。

何もしないことほど効率的なものはないからです。

于 2016-08-10T13:27:44.113 に答える