Slide 1

Slide 1 text

1 / 23 password_hash に詳しくなり たい あかつか PHP" オレ" カンファレンス 神戸2024 7/20 #orekobe

Slide 2

Slide 2 text

2 / 23 自己紹介 あかつか / @aki_artisan 神戸でPHP を書いています 来年のPHP カンファレンス関西の実行委員長をします

Slide 3

Slide 3 text

ことの始まり

Slide 4

Slide 4 text

4 / 23 ふとパスワードハッシュについて調べていたときの こと

Slide 5

Slide 5 text

5 / 23 ふとパスワードハッシュについて調べていたときの こと 若かりし僕はこう思った ソルトとパスワードが同じ場所にあると意味ないんじゃ… ? この発表を聞いた後は、この疑問が解消しているはずです

Slide 6

Slide 6 text

6 / 23 おしながき 1. そもそもパスワードハッシュって何 2. パスワードハッシュにソルトを入れる理由 3. ソルトが同じ場所にあっても良い理由

Slide 7

Slide 7 text

そもそも パスワードハッシュって何?

Slide 8

Slide 8 text

8 / 23 そもそもパスワードハッシュって何? パスワードをそのままDB に保存すると危険 万一漏洩した場合、そのままログインを許してしまう ハッシュ化してDB に保存する ハッシュは元に戻せない、衝突しない変換

Slide 9

Slide 9 text

9 / 23 ハッシュを使ったログインの仕組み パスワード登録時はハッシュ化してDB に保存 ログイン時は入力されたパスワードをハッシュ化して保存していたハッシュ と比較

Slide 10

Slide 10 text

ハッシュのソルトって何?

Slide 11

Slide 11 text

11 / 23 ソルトって何? 塩です(というのは冗談) ハッシュ化する際にパスワードに付加するランダムな文字列 DB が漏洩しても、ソルトがあると元のパスワードを推測されにくい $hash = md5('password'); // 5f4dcc3b5aa765d61d8327d $hash_with_salt = md5('password' . 'this_is_salt'); // dfb54bd568de04c8a505383

Slide 12

Slide 12 text

12 / 23 ソルトを使う理由 セキュリティの強化 レインボーテーブル攻撃を防ぐ ハッシュ値を事前に計算しておくことで、ハッシュ値から元の値を逆引 きする攻撃 ソルトをつけておくとソルトの種類だけテーブルを用意しないといけなくな るので、攻撃が困難になる

Slide 13

Slide 13 text

PHP でのパスワードハッシュ

Slide 14

Slide 14 text

14 / 23 PHP でのパスワードハッシュ password_hash でハッシュ化 password_verify で検証 以上!簡単! $password = "my_password"; $hash = password_hash($password, PASSWORD_BCRYPT); // $2y$10$vN1BBXwK.IWTrkRcRG2tLu67FPkpF2lLrf0By5rdzwa3NdzEgiBQi $password = "my_password"; $hash_from_db = '$2y$10$vN1BBXwK.IWTrkRcRG2tLu67FPkpF2lLrf0By5rdzwa3NdzEgiBQi' if (password_verify($password, $hash_from_db)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; }

Slide 15

Slide 15 text

15 / 23 デモ!(password_hash ) https://php-play.dev/? c=DwfgDgFmBQAkYEMDOSDuB7ATgEwAQF5cAiAWwE8B9RFDHIgbmjgmQgN2

Slide 16

Slide 16 text

ソルトが同じ場所にあっても良 い理由

Slide 17

Slide 17 text

17 / 23 ソルトが同じ場所にあっても 良い理由 ソルトが毎回ランダムで生成される レインボーテーブル攻撃を成立させるには、あらかじめそのソルトをつけた 文字列のハッシュ値を計算しておく必要がある

Slide 18

Slide 18 text

18 / 23 password_hash を使うべき理由 ソルトが自動で生成される タイミング攻撃に対しても安全 ここはPHP に任せる!

Slide 19

Slide 19 text

19 / 23 このスライドで伝えたかったこと セキュリティを考えるときは「何から守るために何をするのか」を考える フレームワークにしたら安全そうじゃん?はよくない

Slide 20

Slide 20 text

おまけ

Slide 21

Slide 21 text

21 / 23 デモ!(crypt とpassword_hash ) salt が同じならちゃんと同じハッシュ値になるのか password_hash は毎回ランダムなsalt を生成するので検証がしづらい https://php-play.dev/? c=DwfgDgFmBQD0sAJCLDIToZD3DIH4ZCTDNAJGAQwGciB3AewCcATBAXgQCI ABUASiERBCICABsdWUBeo0AvxTx8oociNlUiHUoPVz8Adj8AJg7s4XgETW1ipWVA AHJcDuZcAEYABlwNhAA6BFwqnR7oAFN1CHImNZoFuwAuJjOL12--AAl- JwAKIRAAyQnujyYywQcPhcM%2BjG%2Bsy081%2B5wBQNBEN6iEmJkAMgyAADlA xk8oQ1CeGulCAAtgQdA99QFDTjTdAQAA%2BaBAA&v=8.3&f=console

Slide 22

Slide 22 text

Thank you!

Slide 23

Slide 23 text

23 / 23 参考文献 https://www.php.net/manual/ja/faq.passwords.php https://www.php.net/manual/ja/function.password-hash.php https://www.php.net/manual/ja/function.password-verify.php