web-dev-qa-db-ja.com

APIのHTTP基本認証の単純なステートレスな代替手段

現在、多くのAPI(サービス)は、OAuth、HTTP基本認証、またはAPIキーを使用してユーザーを認証しています。

私の目標は単純なセキュリティユーザーの認証クライアント側のWebアプリケーションで見つけるステートレスone serviceの方法。

認証方法

認証方法のいくつかについての私の見解は次のとおりです。

  1. OAuthは素晴らしい解決策のように見えますが、-非常に複雑に設定されており、-過剰に見えるに見えます1つのサービスのみ。

  2. [〜#〜] owasp [〜#〜] によると、HTTP基本認証は安全ではないため、アプリケーションでは使用しないでください "。

  3. クライアント側のWebアプリケーションでプレーンなAPIキーを使用することは、HTTP基本認証と比較して改善のようには見えません。

暗号化されたトークンの使用

私の代替案は、サービスで検証できる暗号化されたトークンを使用することです。

  1. トークンの平文には、トークンのsernamepasswordおよびexpiration dateが含まれます。
  2. プレーンテキストはsecret keyを使用して暗号化されます。これはサーバーだけが知っています。

  3. 平文は[暗号化[〜#〜] aes [〜#〜]を使用してサーバー上でGCMモードになるため、整合性は操作されません。

ユーザーはloginに自分のユーザー名とパスワードを付けてトークンを受信する必要があります。このトークンはすべてのリクエストで送信され、サーバーではverifiedになります。

説明する:

+----------+                                          +-----------+
|          +------      Login with user:pass     ---->+           |
|  Client  |                                          |    API    |
|          +<----       Send encrypted token      ----|           |
|          |                                          |           |
|          +------    Use token to authenticate  ---->+           |
+----------+                                          +-----------+

検証

検証は次の方法で行うことができます。

  1. secret keyを使用してトークンを復号化します。
  2. sernameおよびpasswordを確認します。
  3. トークンis is expiredかどうかを確認します。

プロの

このアプローチの可能なプロ:

  1. トークンをlocalStorageに保存してCSRF攻撃を緩和でき、ユーザーはlocalStorageをクリアすることでログアウトできます。
  2. プレーンテキストのログイン情報は、すべてのリクエストで送信されるわけではありません。
  3. トークンには有効期限があります。

短所

このアプローチの考えられる欠点:

  1. すべてのリクエストを復号化することにより、サーバーの負荷が増加します。
  2. トークンは特定のサーバーにバインドされます。

良い解決策は何だと思いますか?他の良い代替案を知っていますか?

4
swordsecurity

提案されたソリューションは、JSON Web Tokens(JWT)とほぼ同じです。

  • ユーザーに関する情報を含むステートレストークン
  • 共有シークレットまたは非対称キーを使用して署名および/または暗号化
  • 期限切れのタイムスタンプでマーク

詳細は https://jwt.io/ を参照してください。多くの十分にテストされたライブラリがこれらのトークンを処理するためにすでに存在しているので、独自にローリングするのではなく、この標準を使用して非常にうまく機能します。

パスワードが秘密鍵で暗号化または署名されているという事実から、パスワードが認証ルーチンによって作成されたことが証明されるため、通常はパスワードをトークンに格納する必要はありません。これは、パスワードを検証してトークンを生成する完全に独立した認証サービスを使用できるという重要な利点を提供しますが、メインアプリケーションは、読み取りトークン。

特定のサーバーとの関連付けについては、次の2つの方法のいずれかで複数のサーバーを処理できます。

  • すべてのサーバーに同じ共有シークレットがインストールされている対称暗号化を使用しますが、他の誰も発見することはできません。
  • 非対称暗号化を使用し、createトークンを必要とする各サーバーで異なる秘密鍵を生成し、readトークン。
6
IMSoP