簡単に取り消し可能な不透明なトークンを持つというアイデアのように。しかし、O(1) ルックアップ時間を維持したいと思います。
キー ルックアップが O(1) であると仮定すると、次のスキームが機能するはずです。
Client Auth Code Issued = Url64(ENC(random_index||secretkey) || HMAC)
Database Record = {KEY: random_index , VALUE: scrypt(secretkey)}
説明:
発行
- 2 つのランダムな文字列 a
random_indexとsecret_key
- パスワードハッシュ
secret_keyのベストプラクティスを使用してハッシュrandom_indexし、db の下に保存します。
random_indexandを暗号secret_key化し、クライアントにauth_code
検証
- クライアント
auth_codeをrandom_indexとsecret_keyコンポーネントに復号化する
random_indexデータベースでトークンを検索する
secret_key発行時にハッシュ方式を使用して検証します。
上記で問題は解決すると思いますが、他の解決策を歓迎します。
注:秘密鍵(有効期限、権限など)とともに他のメタデータを保存しますが、これは質問に答えるには重要ではありません。
注 2 :でエントロピーを制御する代わりに、scryptまたはそれを理由に、SHA2 または別の高速ハッシュ アルゴリズムを使用して回避することもできます。bcryptsecret_key