web-dev-qa-db-ja.com

トークンベースの認証-トークンの保護

私はモバイルアプリ用のバックエンドREST APIを開発しました。現在、アプリの実行ごとにユーザーにログインを要求する必要がないように、トークンベースの認証を実装することを検討しています。

私が考えていたのは、ユーザーがSSL経由の基本認証を使用して資格情報を送信する最初のリクエストでした。サーバーは、資格情報を認証すると、セキュリティで保護されたトークンを作成し、ユーザーに送り返して、トークンが期限切れになるか取り消されるまで後続の要求で使用できるようにします。

MoM /リプレイ攻撃などの影響を受けないトークンを生成する方法、およびトークン内に格納されているデータを抽出できないようにする方法に関するアドバイスを探しています。

次の approach を使用して、トークンが生成され、データが抽出されなくなると思います。ただし、他の攻撃の影響を受けないようにする必要があります。

APIはSSL経由でのみアクセスできますが、セキュリティの観点からこれにのみ依存できるかどうかはわかりません。

99
James

「認証トークン」は、サーバーがそれを記憶する方法によって機能します。

一般的なトークンはランダムな文字列です。サーバーはそのデータベースに、発行されたトークンから認証されたユーザー名へのマッピングを保持します。サーバーのデータベースが無制限に大きくなるのを防ぐために、古いトークンを自動的に削除できます。このようなトークンは、攻撃者が無視できない確率で有効なトークンを作成できない限り、セキュリティには十分です。「有効なトークン」は「発行されたトークンのデータベースにあるトークン」です。 sufficient は、トークン値の長さが16バイト以上で、暗号的に強力なPRNG(eg _/dev/urandom_、CryptGenRandom()、_Java.security.SecureRandom_...プラットフォームによって異なります)。

クライアント自体のストレージ要件をオフロードすることが可能です。上記の段落で、サーバーがトークンに対して持つ「メモリ」は何ですか?つまり、ユーザー名とトークンの作成日です。したがって、次のようにトークンを作成します。

  • サーバーには秘密鍵 [〜#〜] k [〜#〜] があります(たとえば、128ビットのシーケンスで、暗号的に安全なPRNGによって生成されます)。
  • トークンには、ユーザー名( [〜#〜] u [〜#〜] )、発行時刻( [〜#〜] t [〜 #〜] )、および キー付き整合性チェック [〜#〜] u [〜#〜] および [〜#〜] t [〜#〜] (一緒に)、 [〜#〜] k [〜#〜] でキー設定(デフォルトでは、 [〜#〜] hmac [〜#〜] とSHA-256またはSHA-1を使用)。

[〜#〜] k [〜#〜] に関する彼の知識のおかげで、サーバーは、ユーザーから返された特定のトークンが自分のトークンであるかどうかを確認できます;しかし、攻撃者はそのようなトークンを偽造することはできません。

リンクする回答は、MACの代わりに encryption について説明していることを除いて、多少似ています。

  1. 混乱した;
  2. 紛らわしい;
  3. 安全でない可能性があります。

暗号化はMACではないためです。

82
Thomas Pornin

つまり、暗号強度のワンタイムランダムトークンを使用して、データベースでハッシュする必要があります。

トークン

  • 必須は1回のみ使用できます。
  • mustは、それが作成されたユーザーのみが使用できます。
  • mustHTTPS経由でのみ送信する必要があります。
  • 有効期限には有効期限(たとえば7日)が必要です。

ユーザーがトークンを使用してログインすると、トークンは無効になるため、新しいトークンを作成してユーザーに付与する必要があります。期限切れのトークンの場合、ユーザーは実際の資格情報を使用して再度ログインする必要があります。

これらのルールのより決定的で長い説明は、 フォームベースのWebサイト認証の決定的なガイド のパート2にあります。

永続的なログインCookie(「remember me」機能)は危険ゾーンです。一方では、ユーザーがそれらの処理方法を理解していれば、従来のログインと同じくらい完全に安全です。一方で、それらは公共のコンピューターでそれらを使用し、ログアウトを忘れ、Cookieとは何か、またはそれらを削除する方法を知らないほとんどのユーザーの手に大きなセキュリティリスクがあります。

[...]

Charles Millerの「ベストプラクティス」の記事 に従ってください。彼の記事の最後にリンクされている「改善された」ベストプラクティスに従うように誘惑されないでください。残念なことに、スキームの「改善」は簡単に阻止されます(「改善された」Cookieを盗むときに攻撃者が実行する必要があるのは、古いCookieを削除することです。これにより、正当なユーザーが再ログインして新しいシリーズ識別子を作成する必要があります。盗まれたものを有効なままにしておきます)。

そして、永続的なログインクッキー(トークン)をデータベースに保存しないでください。ハッシュはそれだけです!ログイントークンはパスワードと同等であるため、攻撃者がデータベースを手に入れたら、トークンを使用して、平文のログインパスワードの組み合わせであるかのように、任意のアカウントにログインできます。したがって、永続的なログイントークンを格納する場合は、強力なソルトハッシュ(bcrypt/phpass)を使用してください。


更新:すみません、質問を誤解しました。リンクした方法は妥当に見えますが、リプレイ攻撃や中間者攻撃から保護することはできません。 SSLを併用する必要があります。

38
Polynomial

純粋なRESTful API Webサービスは、基になるプロトコル標準機能を使用する必要があります。

  1. HTTPの場合、RESTful APIは既存のHTTP標準ヘッダー、ステータスコード、およびメソッドを採用し、それらに準拠する必要があります。新しいHTTPヘッダーを追加すると、RESTの原則に違反します。

  2. RESTfulサービスはステートレスでなければなりません。サーバー上の以前のREST要求の状態を記憶しようとするトークンベースの認証など)は、RESTの原則に違反します。

結論:認証/承認のために、HTTP承認ヘッダーを使用する必要があります。また、認証が必要な後続の各リクエストに特定のHTTP承認スキームヘッダーを追加する必要があります。

Cisco Prime Performance Managerアプリケーション用のRESTful Webサービスを開発しました。 GoogleでCisco Prime Performance Managerを検索しますREST RESTFul APIコンプライアンスの詳細については、そのアプリケーション用に作成したAPIドキュメント-下記を参照してください。このアプリケーションでは、HTTP "Basic "リクエストを認証および承認するための承認スキーム。そして明らかに、HTTP承認を使用する場合、クライアントからサーバーに送信されるすべてのデータを暗号化するためにHTTPを使用しています。

http://www.Cisco.com/c/en/us/support/cloud-systems-management/prime-performance-manager/products-programming-reference-guides-list.html

4
Rubens Gomes