web-dev-qa-db-ja.com

アクセストークン/パスワードリセットトークンをデータベースに保存する方法

ワンクリックでサイトにアクセスできるように、ユーザーに送信されるアクセスコードがあります。アクセスの観点から、それはパスワードリセットURLに非常に似ているので、同じ仮定が適用されると思います。

例えば。この question 人々はこのタイプのトークンをハッシュ化することを提案していますが、問題は:bcryptを使用する場合、どのように保存してクエリを返すか、生成中に一意性を確保できるでしょうか?データベース内のすべてのトークンをチェックする以外に方法はありません。

これは、bcryptをその目的で使用できないか、何か不足していることを意味しますか?

6

平文トークンが一意であることを知っているので(または少なくともこれは論理的な推論です)、ソルトは必要ありません。 saltの意図は、同一のパスワードの場合にハッシュの一意性を提供することだけですが、入力スペースは一意であることが保証されているため、この問題は発生しません。

さらに、プレーンテキストのランダム性とサイズを制御できるので、従来の方法で脆弱なパスワードがクラックされることを心配する必要はありません。したがって、プロセスを遅くするためにbcryptは実際には必要ありません。入力スペースが大きくランダムな場合は、ソルトなしの強力な暗号化ハッシュ(SHA256など)でハッシュ化できます。これにより、新しいトークンを生成するときに、データベースにH(token)があるかどうかを簡単に確認できます(一意性チェック)。

リセットリクエストを検証するプロセスは非常に簡単です。ユーザーIDとプレーンテキストトークン(リセットリンクで提供される)を取得し、H(token)を再度計算してデータベースで一致することを確認します。

または、bcryptを引き続き使用する場合は、ランダムトークンの前にユーザーIDを付加してからbcryptに渡すことで、一意性を確保できます。これにより、一意性を検証する必要はなく(IDプレフィックスにより常に一意になります)、トークンを正常に検証できます。

9
Polynomial

BCryptを使用できます。簡単な解決策は、ユーザーにIDとトークンを送信することです。

https://example.com/pwdReset?resetId=123&resetKey=[your long randomly generated key]

Idを使用してハッシュを検索できます(ユーザー名を使用してユーザーのパスワードハッシュを検索するのと同じように)。

3
Jacco