Slide 1

Slide 1 text

パスワードの ハッシュ、 ソルト   ってなに? 2024/09/28 PHP カンファレンス沖縄 2024

Slide 2

Slide 2 text

燃えがちなニュース 「約 ◯ 万アカウントの情報  漏えいか 平文パスワードも」 「平文パスワード ◯ 万件流出件、  n カ月たってもサービス再開できず」 「◯ 万名を超えるユーザ情報が  流出、パスワードは平文」

Slide 3

Slide 3 text

燃えがちなニュース 「約 ◯ 万アカウントの情報  漏えいか 平文パスワードも」 「平文パスワード ◯ 万件流出件、  n カ月たってもサービス再開できず」 「◯ 万名を超えるユーザ情報が  流出、パスワードは平文」

Slide 4

Slide 4 text

そんなときによく耳にする言葉 パスワードはハッシュ化 して保存しないと!

Slide 5

Slide 5 text

そんなときによく耳にする言葉 ハッシュだけじゃなくて ソルトもな! パスワードはハッシュ化 して保存しないと!

Slide 6

Slide 6 text

Slide 7

Slide 7 text

• 同じ入力を与えると同じ出力をする • 同じ出力となる、異なる入力が(事実上)存在しない • 出力から入力を(事実上)推測することができない • 規則性がない (暗号学的)ハッシュ関数とは

Slide 8

Slide 8 text

ハッシュ関数の例 php > echo md5('a'); 0cc175b9c0f1b6a831c399e269772661 php > echo md5('b'); 92eb5ffee6ae2fec3ad71c777531578f php > echo md5('aa'); 4124bc0a9335c27f086f24ba207a4912

Slide 9

Slide 9 text

スライド終盤まで説明の便宜上 MD5 を用いますが 20 年近く前には脆弱性が発見されているため パスワードハッシュには絶対に MD5 を使わないで下さい ⚠おことわり

Slide 10

Slide 10 text

パスワード平文を知らずにパスワードを検証する b4af804009cb036a4ccdc33431ef9ac9 ? ハッシュ関数 DB に保存されている値 ⚠実際にはパスワードハッシュには絶対に MD5 を使わないで!

Slide 11

Slide 11 text

パスワード平文を知らずにパスワードを検証する b4af804009cb036a4ccdc33431ef9ac9 ? ハッシュ関数 ログインフォーム の入力 5f4dcc3b5aa765d61d8327deb882cf99 DB に保存されている値 ハッシュ関数 password ⚠実際にはパスワードハッシュには絶対に MD5 を使わないで!

Slide 12

Slide 12 text

パスワード平文を知らずにパスワードを検証する b4af804009cb036a4ccdc33431ef9ac9 ? ハッシュ関数 ログインフォーム の入力 5f4dcc3b5aa765d61d8327deb882cf99 DB に保存されている値 ハッシュ関数 password ≠ ⚠実際にはパスワードハッシュには絶対に MD5 を使わないで!

Slide 13

Slide 13 text

パスワード平文を知らずにパスワードを検証する b4af804009cb036a4ccdc33431ef9ac9 ? ハッシュ関数 ログインフォーム の入力 b4af804009cb036a4ccdc33431ef9ac9 DB に保存されている値 ハッシュ関数 pass1234 ⚠実際にはパスワードハッシュには絶対に MD5 を使わないで!

Slide 14

Slide 14 text

パスワード平文を知らずにパスワードを検証する b4af804009cb036a4ccdc33431ef9ac9 ? ハッシュ関数 ログインフォーム の入力 b4af804009cb036a4ccdc33431ef9ac9 DB に保存されている値 ハッシュ関数 pass1234 = ⚠実際にはパスワードハッシュには絶対に MD5 を使わないで!

Slide 15

Slide 15 text

• 同じ入力を与えると同じ出力をする • 同じ出力となる、異なる入力が(事実上)存在しない • 出力から入力を(事実上)推測することができない • 規則性がない 再掲:(暗号学的)ハッシュ関数とは

Slide 16

Slide 16 text

わるいやつの考え 事前に網羅して おけばよくね?

Slide 17

Slide 17 text

わるいやつの考え a 0cc175b9c0f1b6a831c399e269772661 aa 4124bc0a9335c27f086f24ba207a4912 ab 187ef4436122d1cc2f40dc2b92f0eba0 : : pass1234 b4af804009cb036a4ccdc33431ef9ac9 : :

Slide 18

Slide 18 text

わるいやつの考え b4af804009cb036a4ccdc33431ef9ac9 ? ハッシュ関数 DB に保存されている値 a 0cc175b9c0f1b6a831c399e269772661 aa 4124bc0a9335c27f086f24ba207a4912 ab 187ef4436122d1cc2f40dc2b92f0eba0 : : pass1234 b4af804009cb036a4ccdc33431ef9ac9 : :

Slide 19

Slide 19 text

わるいやつの考え b4af804009cb036a4ccdc33431ef9ac9 ? ハッシュ関数 DB に保存されている値 a 0cc175b9c0f1b6a831c399e269772661 aa 4124bc0a9335c27f086f24ba207a4912 ab 187ef4436122d1cc2f40dc2b92f0eba0 : : pass1234 b4af804009cb036a4ccdc33431ef9ac9 : : パスワードは pass1234 だ!

Slide 20

Slide 20 text

わるいやつの考え b4af804009cb036a4ccdc33431ef9ac9 ? ハッシュ関数 DB に保存されている値 a 0cc175b9c0f1b6a831c399e269772661 aa 4124bc0a9335c27f086f24ba207a4912 ab 187ef4436122d1cc2f40dc2b92f0eba0 : : pass1234 b4af804009cb036a4ccdc33431ef9ac9 : : パスワードは pass1234 だ! レインボーテーブル

Slide 21

Slide 21 text

ハッシュ化する際に入力に付与するランダムな文字列 ソルトとは? QS6FhJwNem pass1234 パスワード 登録時の入力 ソルト ハッシュ関数 + 9cc4da9a6c9f802e8a10fee336cf6658 ⚠実際にはパスワードハッシュには絶対に MD5 を使わないで!

Slide 22

Slide 22 text

ハッシュ化する際に入力に付与するランダムな文字列 ソルトとは? QS6FhJwNem pass1234 パスワード 登録時の入力 ソルト ハッシュ関数 + 9cc4da9a6c9f802e8a10fee336cf6658 DB に保存しておく ⚠実際にはパスワードハッシュには絶対に md5 を使わないでね!

Slide 23

Slide 23 text

ソルトを保存する カラムは見たこと ないなあ......

Slide 24

Slide 24 text

password_hash 関数

Slide 25

Slide 25 text

bcrypt アルゴリズム(PASSWORD_BCRYPT)の例 password_hash の戻り値 php > $hash = password_hash('pass1234', PASSWORD_BCRYPT); php > echo $hash; $2y$10$c9Bsp/6U5nCELYMkO8B/YuVp5MGFgmQcHEabeji2ANiasyQqkXspy

Slide 26

Slide 26 text

bcrypt アルゴリズム(PASSWORD_BCRYPT)の例 アルゴリズム(バージョン)とコスト password_hash の戻り値 php > $hash = password_hash('pass1234', PASSWORD_BCRYPT); php > echo $hash; $2y$10$c9Bsp/6U5nCELYMkO8B/YuVp5MGFgmQcHEabeji2ANiasyQqkXspy

Slide 27

Slide 27 text

bcrypt アルゴリズム(PASSWORD_BCRYPT)の例 ソルト(22 文字) password_hash の戻り値 php > $hash = password_hash('pass1234', PASSWORD_BCRYPT); php > echo $hash; $2y$10$c9Bsp/6U5nCELYMkO8B/YuVp5MGFgmQcHEabeji2ANiasyQqkXspy

Slide 28

Slide 28 text

bcrypt アルゴリズム(PASSWORD_BCRYPT)の例 ハッシュ値(31 文字) password_hash の戻り値 php > $hash = password_hash('pass1234', PASSWORD_BCRYPT); php > echo $hash; $2y$10$c9Bsp/6U5nCELYMkO8B/YuVp5MGFgmQcHEabeji2ANiasyQqkXspy

Slide 29

Slide 29 text

password_hash と password_verify php > $hash = password_hash('pass1234', PASSWORD_BCRYPT); php > echo $hash; $2y$10$c9Bsp/6U5nCELYMkO8B/YuVp5MGFgmQcHEabeji2ANiasyQqkXspy php > var_dump(password_verify('invalid', $hash)); bool(false) php > var_dump(password_verify('pass1234', $hash)); bool(true) 自動でソルトが付くので $hash の値は実行ごとに変わる

Slide 30

Slide 30 text

password_hash と password_verify php > $hash = password_hash('pass1234', PASSWORD_BCRYPT); php > echo $hash; $2y$10$c9Bsp/6U5nCELYMkO8B/YuVp5MGFgmQcHEabeji2ANiasyQqkXspy php > var_dump(password_verify('invalid', $hash)); bool(false) php > var_dump(password_verify('pass1234', $hash)); bool(true) 自動でソルトが付くので $hash の値は実行ごとに変わる

Slide 31

Slide 31 text

password_hash と password_verify php > $hash = password_hash('pass1234', PASSWORD_BCRYPT); php > echo $hash; $2y$10$c9Bsp/6U5nCELYMkO8B/YuVp5MGFgmQcHEabeji2ANiasyQqkXspy php > var_dump(password_verify('invalid', $hash)); bool(false) php > var_dump(password_verify('pass1234', $hash)); bool(true) 自動でソルトが付くので $hash の値は実行ごとに変わる

Slide 32

Slide 32 text

アルゴリズムの情報も保持しているため検証できる 余談:password_needs_rehash PHP: password_needs_rehash - Manual https://www.php.net/manual/ja/function.password-needs-rehash.php

Slide 33

Slide 33 text

PHP マニュアルを読もうな!! PHP: パスワードのハッシュ - Manual https://www.php.net/manual/ja/faq.passwords.php

Slide 34

Slide 34 text

燃えがちなニュース 「約 ◯ 万アカウントの情報  漏えいか 平文パスワードも」 「平文パスワード ◯ 万件流出件、  n カ月たってもサービス再開できず」 「◯ 万名を超えるユーザ情報が  流出、パスワードは平文」

Slide 35

Slide 35 text

所属:株式会社ウィルゲート 登壇: 寄稿: 岡田 正平/おかしょい X: @okashoi GitHub: @okashoi