パスワードは平文保存禁止。ハッシュ化して保存する。ただし単純なハッシュ(MD5/SHA-1)は 高速に総当たりでき、レインボーテーブルで逆引きされる。ソルト(利用者ごとの ランダム値)とストレッチング(反復)で守る。
| 平文(保存してはいけない) | password |
| MD5(弱い) | 5f4dcc3b5aa765d61d8327deb882cf99 |
| SHA-256(速い=総当たりに弱い) | 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 |
| SHA-256 + ソルト | 7e1dd6176cdb15aaf5e87ccf7210e56b3caefa856b4052f69f1ecf4011cc3878 |
| bcrypt(ソルト+ストレッチング内蔵・推奨) | $2y$10$UHsZ0ygqo9m09HB7sdNI8.zrtIQLfPujtZYsW7ondvSAi9l.RhZkG |
同じパスワードでも、ソルトが違えばハッシュが変わる(レインボーテーブル無効化)。
bcrypt は毎回異なる値になり、反復回数で総当たりを遅くできる。実装は自作せず
password_hash() / password_verify() を使う。
総当たりの速さは「1秒間に何回ハッシュを計算できるか」で決まる。 このサーバーで MD5 と bcrypt を実際に計算して比べる。