web-dev-qa-db-ja.com

パスワードリセットトークンは、データベースに保存するときにハッシュする必要がありますか?

パスワードはハッシュ化されているため、誰かがパスワードのデータベースにアクセスした場合、実際のパスワードがわからないため、ログインできません。

ただし、有効なパスワードリセットトークン(ユーザーがパスワードを忘れたときにユーザーにメールで送信される種類)を取得できる場合、これはパスワードと同じではありませんか?

トークンを取得し、それをリセットページに接続して、パスワードを好きなように設定すると、アクセスできるようになります。

したがって、パスワードリセットトークンもデータベースでハッシュされるべきではありませんか?

29
Ian Warburton

はい、あなたが言及した理由とまったく同じ理由で、パスワードリセットトークンをハッシュする必要があります。

しかし、それはハッシュされていないパスワードほど悪くはありません。

  1. リセットトークンが期限切れになり、すべてのユーザーがアクティブなトークンを持っているわけではない
  2. ユーザーはパスワードが変更されたときに気づきますが、パスワードが解読されたときは気付かないため、損傷を制限するための措置を講じることができます(パスワードの変更やその他の機密データなど)。

さらに、ユーザーがパスワードを再利用すると、攻撃者はユーザーのメールなど、他のアカウントのクラックされたパスワードを試すことができるため、被害が増大します。

23
tim

いいえ、パスワードリセットトークンは、時間制限があり、使い捨てである限り、ハッシュする必要はありません。リセットトークンのハッシュにはいくつかの利点がありますが、その利点はパスワードの場合よりも小さいため、リセットトークンのハッシュが絶対に必要であるとは考えません。

通常、パスワードリセットトークンには時間制限があります。たとえば、1時間だけ有効で、その後期限切れになる場合があります。また、通常、パスワードリセットトークンは制限されているため、1回しか使用できず、使用後は取り消されます。これは良い習慣であり、間違いなくこれを行うべきです。

これを行う場合、パスワードリセットトークンをデータベースに保存するときに、ハッシュする必要はありません。ハッシングが防御するように設計されている脅威モデルを思い出してみましょう。これは、1回限りのデータベース違反を軽減するように設計されています。言い換えると、攻撃者は、ある時点でデータベースをダンプできる脆弱性を発見したと想定しています。 (おそらくSQLインジェクションの脆弱性か、そのようなものです。)これが発生した場合、被害をできるだけ制限したいと考えています。

パスワードの場合は、ハッシュ化することが重要です。そうしないと、2つの悪いことが起こります。(i)単一のデータベース違反によりすべてのユーザーのパスワードが侵害され、攻撃者がサイト上のすべてのユーザーのアカウントにアクセスできるようになります。 (ii)ユーザーは他のサイトでパスワードを再利用することが多いため、攻撃者が他のサイトのユーザーのアカウントにアクセスする可能性があります。ハッシュを行う場合でも、データベース侵害は依然として悪いですが、それははるかに悪いことではありません。

パスワードリセットトークンについては、どちらも正しくありません。パスワードリセットトークンをハッシュしないとしましょう。その後、単一のデータベース違反では、違反時にアクティブだったリセットトークンのセットのみが明らかになります。サイトには数百万のユーザーがいる可能性がありますが、そのタイムでアクティブになるリセットトークンはごくわずかなので、アカウントを公開しているユーザーはごくわずかです。それははるかに深刻です。

また、パスワードリセットトークンは、ユーザーではなくランダムに選択されます。その結果、これらは他のサイトでは再利用されず、サイトx.comのリセットトークンが侵害されても、他のサイトのユーザーのアカウント(y.comなど)にリスクが生じることはありません。 。したがって、ユーザーパスワードをハッシュする2番目の理由は、リセットトークンにも当てはまりません。

ハッシュされていないパスワードリセットトークンが悪用される可能性のあるシナリオが1つあることに言及することは価値があります。攻撃者がデータベースへの読み取りアクセスを獲得できた場合、攻撃者は一部のユーザー(alice)のパスワードリセットを要求し、データベースを読み取ることができます。 aliceのパスワードリセットトークンを確認し、それを使用してaliceのパスワードを変更し、彼女のアカウントにアクセスします。ただし、ここにはいくつかの緩和要因があります。攻撃者はこれをリアルタイムで行う必要があるため、攻撃者の時間枠は限られています。電子メールがaliceに送信されるため、攻撃は非常に騒々しく、検出可能です。攻撃者がこの方法で多くのアカウントを制御しようとした場合、侵害はおそらくすぐに気付かれます(ユーザーはサイトの管理者に連絡し、うまくいけば調査するでしょう)。これは、多くのユーザーに対してそのような攻撃を仕掛けようとする攻撃者に対する抑止力です。攻撃者が少数のユーザーにのみ影響を与えたいという標的型攻撃を阻止することはできませんが、攻撃者がすべてのアカウントにアクセスできる可能性は低くなります(ハッシュされていないパスワードで発生する可能性があります)。したがって、ハッシュ化されていないリセットトークンは、ハッシュ化されていないパスワードよりも問題が少なくなります。

誤解しないでください。パスワードリセットトークンのハッシュにはいくつかの利点があります。ただし、リセットトークンをハッシュするコードを記述するのにもある程度の労力が必要です。セキュリティ上の利点は限られているため、リスク管理の観点からは、リセットトークンをハッシュ化せずに保存することを決定するのはばかげたことではないでしょう。

「リセットトークンをハッシュしないでください」とは言っていません。それらをハッシュする機会がある場合は、すぐに行ってください。セキュリティ上の利点が得られます。同時に、これを全体的に見ると、これはおそらく実装する最も重要なセキュリティ機能ではありません。あなたはおそらくあなたのサイトのセキュリティを強化するためのより多くの利点を提供する多くの他の方法を見つけることができます。

結論:パスワードリセットトークンのハッシュにはいくつかの利点がありますが、制限があります。必須のセキュリティ機能だとは思いません。

15
D.W.