データベースに保存する前にパスワードをハッシュ化しておけば、誰かに復元されることはないのでしょうか?
ここで指摘しておきたいのは、これはデータベースから直接取得する場合に限ってのことであり、アプリケーションのログインページのブルートフォースやクライアント上のキーロガー、そしてもちろんラバーホース暗号解析(最近では "Chocolate Cryptanalysis" と呼ぶべきかもしれません)のような他のタイプの攻撃ではないということです。
**もちろん、どんな形式のハッシュでもこれらの攻撃を防ぐことはできません。
データベースにハッシュ値として保存されているパスワードは、ハッシュ値を総当りで計算するか、レインボーテーブル(使用されているアルゴリズムに固有のもの)を使用して復元することができます。
レインボーテーブルは、辞書ファイルや、より一般的には指定された文字セット(a-z、A-Z、0-9など)のすべての組み合わせについて、あらかじめ計算された一連の値として作成されます。
基本的には、攻撃者がパスワードごとにハッシュを作成するのではなく、テーブル内でハッシュ値を検索できるようにすることで、パスワードのクラッキングを高速化することができます。一般的なパスワードアルゴリズム(NTLM、MD5など)のレインボーテーブルはオンラインで入手可能であり、大量のレインボーテーブルを簡単に入手することが可能である。
データベースに保存されているハッシュのセキュリティを向上させる方法はいくつかあります。
まず、ユーザーごとにソルト値を使用し、この値をハッシュ化されたパスワードと一緒にデータベースに保存します。 ソルト値は秘密にするためのものではありませんが、ブルートフォースプロセスを遅くしたり、レインボーテーブルを実用的に使用できないようにするために使用されます。
また、これに加えて、pepper valueと呼ばれるものを追加しているのを見たことがあります。 これは単なるランダムな文字列ですが、すべてのユーザーに共通で、データベースではなくアプリケーションコードと一緒に保存されていました。ここでの理論は、ある状況下では、データベースは危険にさらされていても、アプリケーションコードは危険にさらされていない場合があり、そのような場合には、この方法でセキュリティを向上させることができるというものです。 しかし、同じパスワード・データベースを使用する複数のアプリケーションがある場合には、問題が生じます。
パスワードのセキュリティを向上させる3つ目の方法は、低速パスワード機能を使用することです。これは、個々のユーザーには大きな影響を与えませんが、データベースから取得したパスワードをクラックする攻撃者の速度を大幅に低下させます。この方法についての詳細はこちらをご覧ください。