2017-01-19 30 views
1

アクティベーションまたはパスワードリセットトークンを含むリンクを構築する最善の方法は何ですか? URLは電子メールで配信され、ユーザーはアカウントを有効にするかパスワードをリセットするためにURLをクリックする必要があります。この上糸の束がありますが、一貫したアプローチがあるように表示されず、それぞれのアプローチは、セキュリティと開発両方の観点から長所と短所を持っているように見えます:アクティベーション/パスワードリセットリンクを構築する最も良い方法

  1. リンクは、パラメータとしてトークンを含んでいますこのアプローチでは、クエリ文字列

    http://www.example.com/activations/:[email protected] 
    

    での電子メールアドレスは、トークンはデータベースにハッシュされ、電子メールは、ユーザーの検索に使用されます。次に、トークンは、brycptのようなライブラリーを使用して、データベース内のハッシュ・バージョンと比較されます。しかし、クエリ文字列に電子メールアドレスなどの機密データを含めると、exposes some security risksと思われます。

  2. リンクには、パラメータまたはクエリ文字列としてのトークンのみが含まれます。

    http://www.example.com/activations/:token 
    

    これは理想的なソリューションであるように思われるが、私は、データベースに格納されたトークンをハッシュ解除されない限り、トークンを比較する方法がわかりません。セキュリティの観点から、ある人はtoken in the database doesn't need to be hashedと主張し、他の人はtoken should be hashedと主張している。データベースにハッシュされたトークンを保持していると仮定すると、データベース内の各トークンを繰り返し、リンク内のトークンと比較するのは非常に時間がかかるようです。だから、おそらく私はこれについて間違っていますが、このアプローチを使用すると、私はデータベースにトークンをunhashedする必要があります。

誰もが最良のアプローチについて考えていますか?

答えて

0

トークンだけを含む方法2を使用することには、引数はありません。

トークンのハッシュのみをデータベースに格納する必要があります(SQLインジェクション)。あなたが見る問題は、bcryptのを使用してから来ている:

  1. bcryptのは、データベース内のトークンを探し防止を、含まれています。
  2. BCryptはキーストレッチを適用するため、検証は非常に遅く、格納されているすべてのハッシュに対してチェックすることはできません。

弱いパスワードを格納するには、これらの2つの手法(塩析とキーストレッチング)が必須です。ブルートフォースは実用的ではありません。私たちのトークンは非常に強力な「パスワード」(最小20文字の0-9 a-z A-Z)なので、これらのテクニックは必要ありません。トークンの無制限SHA-256をデータベースに格納できます。このようなハッシュはSQLで直接検索できます。

本当に安全であることを示すために、簡単な計算をしましょう。 20文字のトークンは7E35の組み合わせを可能にする。もし我々が3 Giga SHA-256 per secondを計算することができれば、試合を見つけるために約3'700'000'000'000'000'000年を期待します。

トークンが暗号的にランダムなソースから作成されていることを確認してください。

+0

この回答ありがとうございます!私はbcryptをハッシュに使用していたので、私は塩を使わずにハッシュすることができなかった! –

関連する問題