簡単に取り消し可能な不透明なトークンを持つというアイデアのように。しかし、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_index
andを暗号secret_key
化し、クライアントにauth_code
検証
- クライアント
auth_code
をrandom_index
とsecret_key
コンポーネントに復号化する
random_index
データベースでトークンを検索する
secret_key
発行時にハッシュ方式を使用して検証します。
上記で問題は解決すると思いますが、他の解決策を歓迎します。
注:秘密鍵(有効期限、権限など)とともに他のメタデータを保存しますが、これは質問に答えるには重要ではありません。
注 2 :でエントロピーを制御する代わりに、scrypt
またはそれを理由に、SHA2 または別の高速ハッシュ アルゴリズムを使用して回避することもできます。bcrypt
secret_key