web-dev-qa-db-ja.com

リセットパスワードトークンの生成に関するベストプラクティス

パスワードリセットトークンの作成方法に関するベストプラクティスはありますか?考えている:

ランダムな17文字[a-zA-Z0-9] +グローバルに一意のID +ランダムな17文字[a-zA-Z0-9]。

パスワードトークンをリセットするためのより良いソリューション、または業界標準はありますか?

22
Justin

考慮すべきいくつかの重要なポイントがあります。

  1. コードは本当にランダムである必要があり(MCRYPT_DEV_URANDOMから読み取られる)、他のユーザー関連情報から派生してはなりません。
  2. 理想的には、コードはbase62エンコード(A-Z a-z 0-9)され、URLの問題を回避します。
  3. データベースにトークンのハッシュのみを保存 、そうでない場合、データベースへの読み取りアクセス権を持つ攻撃者がアカウントをリセットできます。

これにより、ユーザーがリンクをクリックした後、データベースでトークンのハッシュを検索する必要があるという問題が発生します。トークンを保存する方法は2つあります。

  • ソルトなしのSHA512のようなハッシュアルゴリズムでトークンをハッシュします。トークンが非常に強い場合、これは安全です(最小長20、0-9 a-z A-Z)。理論的には、データベースに入力する前に、そのようなハッシュがすでに存在するかどうかを確認する必要がありますが、実際には無視できます。このようなトークンを処理できる password-reset class を実装しました。
  • BCryptとsaltでトークンをハッシュします。これにより、トークンを短くすることができますが、データベースでハッシュされたトークンを検索することはできません。代わりに、トークンを見つけるためにリンクに行IDを含める必要があります。
39
martinstoeckli