3

OAuth 2 トークンは単なるランダム blob です。このランダムな文字列をデータベースに直接保存して検索することを提案しているように見える OAuth サーバーの実装を見てきました。

これは私のより良い判断に反します。

トークンは、基本的にユーザーのもう 1 つのパスワードです。これらのトークンをプレーンテキストでデータベースに保存することは、たとえこれらのパスワードがランダムに生成されたとしても、悪い考えのように思えます。これは、データベースが侵害された場合、攻撃者が行う必要がauth_token=codeあるのは、有効なトークンを持つ任意のユーザーをパスして偽装することだけであるためです。

OAuth 2 の認証トークンを生成して保存する最良の方法は何ですか?

4

1 に答える 1

1

簡単に取り消し可能な不透明なトークンを持つというアイデアのように。しかし、O(1) ルックアップ時間を維持したいと思います。

キー ルックアップが O(1) であると仮定すると、次のスキームが機能するはずです。

 Client Auth Code Issued = Url64(ENC(random_index||secretkey) || HMAC)
 Database Record         = {KEY: random_index , VALUE: scrypt(secretkey)}

説明:

発行

  1. 2 つのランダムな文字列 arandom_indexsecret_key
  2. パスワードハッシュsecret_keyのベストプラクティスを使用してハッシュrandom_indexし、db の下に保存します。
  3. random_indexandを暗号secret_key化し、クライアントにauth_code

検証

  1. クライアントauth_coderandom_indexsecret_keyコンポーネントに復号化する
  2. random_indexデータベースでトークンを検索する
  3. secret_key発行時にハッシュ方式を使用して検証します。

上記で問題は解決すると思いますが、他の解決策を歓迎します。

:秘密鍵(有効期限、権限など)とともに他のメタデータを保存しますが、これは質問に答えるには重要ではありません。

注 2 :でエントロピーを制御する代わりに、scryptまたはそれを理由に、SHA2 または別の高速ハッシュ アルゴリズムを使用して回避することもできます。bcryptsecret_key

于 2013-02-25T17:27:33.383 に答える