パスワードはどのように保存されるか
最近作ったシステムならArgon2と呼ばれるアルゴリズムを使って保存されます。Argon2には3種類のアルゴリズムがありますが、普通はargon2idを利用します。 "password"という文字列をargon2idを使ってハッシュ化すると以下のような感じの文字列になります。Saltの値はランダム値なので生成する度に異なる文字列なります。 $argon2id$v=19$m=1024,t=2,p=2$YVQ5V0ppYUkvL0FrYXFGQQ$Dyox+6sj5PLydYnS0Ft/laYpgVXFF1MN15/qQ5aabnQ
今もBlowfishと呼ばれる古いアルゴリズムを利用しているシステムも多いです。この場合は次のような文字列になります。
$2y$10$bl8WtJKPe1OYDerO.DszDuCHXwNbJ3rPklkEcUdddmAV4L5/UdrPm
NIST標準に準拠したシステムならPBKDF2と呼ばれるアルゴリズムを使って保存します。
"password"という文字列をPBKDF2+SHA2–256を使ってハッシュ化すると以下のような感じの文字列になります。この場合もSaltはランダム値にするので生成する度に異なる文字列(ハッシュ値)になります。
1eab0d0ee9a5c696bd1a7afd7a006e57e316ac2db51982653023e5331deb7f7f
PBKDF2の場合、saltやハッシュアルゴリズム、ストレッチ回数は結果にありません。この為、これらの情報は別の場所に保存し、総当たり攻撃を更に困難にすることも可能です。
Argon2、BlowfishもPBKDF2も予め大量の文字列をハッシュ化しておき、それに一致するかどうかでパスワードを解析する”辞書攻撃”に耐性を持たせています。一定以上の複雑性を持ったパスワードなら解析は非常に困難になります。 ダメなシステムは暗号学的ハッシュ関数だけを使って保存されます。例えば、"password"をSHA2–256でハッシュ化すると、常に以下の文字列になります。”辞書攻撃”で単純なパスワードは容易に解析できます。
5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
もっとダメなシステムはパスワードをそのまま保存します。そのままなのでパスワードを解析する必要もありません。