私は Web アプリケーションを持っており、Google が Google アカウントに追加したものと同様に、セキュリティを強化するために安全なサインオンを追加する任務を負っています。
使用事例
基本的に、ユーザーがログインするときに、ユーザーが以前にこのコンピューターを承認したかどうかを検出する必要があります。コンピュータが認証されていない場合、ユーザーはワンタイム パスワードを (電子メール、SMS、または電話で) 送信され、入力する必要があります。ユーザーは、このコンピュータを記憶することを選択できます。Web アプリケーションでは、許可されたデバイスを追跡し、ユーザーがそのデバイスから最後にいつ/どこでログインしたかを確認し、必要に応じてデバイスの許可を解除します。
非常に軽いタッチ (つまり、クライアント側のソフトウェアのインストールを必要としない) で、Safari、Chrome、Firefox、および IE 7+ (残念ながら) で動作するソリューションが必要です。十分なセキュリティを提供する x509 セキュリティを提供しますが、x509 を使用できない、または使用しない顧客向けのソリューションが必要です。
私の意図は、Cookie を使用して認証情報を保存することです (または、ローカル ストレージを使用して、フラッシュ Cookie に分解し、次に通常の Cookie を使用する可能性があります)。
最初の赤面
2 つの個別の値 (ローカル データまたは Cookie) を追跡します: 安全なサインオン トークンとデバイス トークンを表すハッシュ。どちらの値も Web アプリケーションによって駆動 (および記録) され、クライアントに指示されます。SSO トークンは、デバイスとシーケンス番号に依存します。これにより、デバイスの認証を効果的に解除し (すべての SSO トークンが無効になります)、シーケンス番号を使用してリプレイを軽減し (効果的ではないため、この質問をしているのです)、ナンスを使用します。
問題
このソリューションでは、だれかが SSO とデバイス トークンをコピーして、別の要求で使用することができます。シーケンス番号は、このような悪用を検出してデバイスの認証を解除するのに役立ちますが、検出と応答は、有効なデバイスと悪意のある要求の両方がアクセスを試みた後にのみ発生します。これは、損害が発生するのに十分な時間です.
HMACを使ったほうがいいような気がします。デバイス、シーケンスを追跡し、ノンス、タイムスタンプ、秘密鍵を使用してハッシュを作成し、ハッシュとそれらの値をプレーン テキストとして送信します。サーバーは (デバイスとシーケンスの検証に加えて) 同じことを行い、比較します。秘密鍵を安全にネゴシエート、交換、および保存できると仮定すると、それははるかに簡単で、はるかに信頼性が高いように思えます。
質問
では、許可されたデバイスの秘密鍵を安全にネゴシエートし、その鍵を安全に保管するにはどうすればよいでしょうか? 少なくとも、ローカル ストレージまたはフラッシュ Cookie を使用して秘密鍵を保存することに同意し、それで十分だと言うことは可能ですか? または、私が説明している脆弱性を軽減するために、元のドラフトにできることはありますか?