MVCベースのサーバーアプリケーションを移行し、呼び出しを処理するREST-ful APIを作成中です。OAuth:JavaScriptの秘密キーを非表示にする方法
私はAES暗号化とのOAuth2上に読んで、次のように成長ソリューションは、これらの概念を形成し実施することを決定してきた:
- クライアントは、ユーザーIDやメールを提供してログインするための要求を送信します。この要求は、API秘密鍵を使用してHMACされます。
- サーバーは、ユーザーID /電子メールが既存のアカウントと一致するかどうかを調べ、見つかった場合は、クライアントの応答の一部として送信するサーバーナンスを作成して保存します。
- クライアントは独自のクライアントナンスを作成し、API秘密鍵と両方のnoncesから新しい一時キーを作成します。次に、この一時的なキーを使用して暗号化されたパスワードを持つログイン要求を送信します(エントロピーを追加し、平文でパスワードを送信することを避けるため)。
- サーバーは、このプラットフォームでこのクライアント用に保存した最新のnonce [モバイルとWebクライアントは独自の固有のセッションとセッションを持つことができます]と、暗号化されていない状態で送信されたクライアントnonceを使用して、 HMACがチェックアウトすると、データベース[PBKDF2のハッシングとソルト]に対してパスワードが検証されます。
- 要求が有効で、パスワードとユーザーIDがレコードと一致する場合、そのプラットフォーム上のそのユーザーID用に新しいセッション秘密キーが作成され、この秘密キーがクライアントに送信され、HMACは、それ以降。
- 新しいログインではないリクエストには、セッションシークレットキーとランダム化されたIVから計算されたHMAC署名が含まれます。
すべての通信はTLSによって処理されるため、セキュリティが強化され、唯一の防衛線ではありません。
モバイルアプリでは、モバイルアプリの秘密鍵を設定ファイルに隠すことができます。これはセキュリティの適切な指標を提供します。[多分多くはわかりませんが]私たちのウェブページからのすべてのリクエストをこのフォームに変換すると、これはJavaScriptを使用してクライアント側のAES暗号化と認証を処理することを意味します。well as this article clearly explains "JavaScriptのWebアプリケーションにAPIキーを保存すると、世界全体がブラウザの開発ツールを使ってアクセスできるように、ホームページ全体に大きな太字で書かれている」と語った。
API秘密鍵としてナンスだけを使用することもできますし、これらのリクエストにAES暗号化を使用しないでもかまいません。また、CSRFトークンなどの他の手段で検証し、すべてのリクエストが私たち自身のフロントエンドいくつかの方法 - しかし、私たちが他のページやサービスとの統合を可能にするAPIを作成したいのであれば、これはうまくいかないでしょう。
この記事では、使い捨てのクッキーをトークンとして生成することを提案していますが、それはポスターのサービスには適しているが、私たちにとってはそうではない限定的な解決策です。私は、ユーザーが期限切れでリセットすることができるユーザー固有のキーを使用してユーザーが送信するすべてのリクエストをHMACに送信したいと考えています。サービスが最終的にお金を処理するため、リクエスト認証を厳重に保護します。
私のオプションは何ですか?
is doomedからJavascriptを削除するだけですか? .jsスクリプトにハードコードされた日に秘密鍵を保存する方法はありますか?ログインの呼び出しにのみ使用する新しい一時的な秘密鍵を生成して、サーバーのnonceを要求したときにユーザーに送信する必要がありますか?
また、最初にリンクしたポストは、クッキーを使用してクライアントのセッションキーを保存し、次にJSからキーにアクセスすることを示唆しています。これは大丈夫ですか、それはシールよりも多くの穴を提供しますか?
クライアントがセッションキーをクッキーとして取得し、それを送信すると、HMAC署名が必要ないと言っていますか?改訂された認証パターンを使用してリプレイ攻撃から保護する方法を教えてください。 – ConnorU
CSRFトークンは、再生攻撃を防ぎます。 1.クライアントは '/ change_password'を要求します2.サーバはCSRFトークンを作成し、それをトークンリストに保存します(妥当な有効期限があります)。それにはCSRFトークンが含まれています。 (例えば 'action ="/do_password_change?csrf = [token] "の形式で)3.クライアントがCSRFトークンをリクエストとともに送信する4.サーバがCSRFトークンをチェックし、それをトークンリストから削除するこれにより、CSRFトークンの2回目の使用で不正なリクエストが発生する(サーバはそれが使用されていることが分かっているため)リプレイ攻撃を防ぎます。 – Halcyon
私はCSRFのビットを読んでいます。誰かがより多くのインプットやアイデアを持っている場合に受け入れられます。ありがとう! – ConnorU