言葉・技術

なぜパスワードはハッシュ化して保存するの?

まず答え

サービスは通常、入力されたパスワードそのものではなく、照合に使うハッシュ値を保存します。データベースが漏れても元の文字列をそのまま見られないようにし、被害を減らすためです。ただし、「ハッシュ化」ならどの方法でも安全というわけではありません。

登録時とログイン時の照合

登録時、システムはパスワードに、そのパスワード専用のランダムな「ソルト」を加えて、パスワード保存用の方式で計算します。ソルト、使った方式やコスト設定を示す情報、計算結果を保存します。ログイン時には、保存済みのソルトと設定を使い、入力されたパスワードを同じ方式で計算して、保存した結果と比べます。

ソルトは秘密にする鍵ではありません。異なるソルトを使えば同じパスワードからも異なるハッシュ値ができ、同じパスワードを使う人がいるか値だけから分かりにくくなります。また、攻撃者が事前に作ったハッシュ表をそのまま使い回しにくくします。

なぜ専用の方式が必要なの?

データベースを手に入れた攻撃者は、パスワード候補を自分の機器で何度も計算し、保存値と比べることができます。この「オフライン攻撃」を遅らせるには、時間やメモリを使うパスワード保存用の方式が必要です。一般的な高速ハッシュの SHA-256 などをそのまま使う方法は、候補をすばやく試せるため適していません。

専用の方式には、計算の手間を調整する設定があります。例として Argon2id があり、計算に必要な時間やメモリを増やすと、攻撃者の候補試しにもより多くの資源が必要になります。ただし、正しいログインを確かめる処理にも時間や計算資源が必要なので、サービスに合う設定を選びます。

ログイン試行の制限は別の対策

ログイン回数の制限は、サービスに何度もパスワードを送る「オンライン攻撃」への対策です。盗まれたデータベースを手元で試す攻撃には効かないため、専用のハッシュ方式や推測されにくいパスワードと組み合わせます。ハッシュ化しても、短く推測しやすいパスワードが安全になるわけではありません。

参考資料