Slide 1

Slide 1 text

ハッシュと暗号は違うぞ! PHPカンファレンス関西 2017 2017/07/15(土)13:10〜 長谷川智希 HASEGAWA Tomoki

Slide 2

Slide 2 text

長谷川 智希 デジタルサーカス株式会社 副団長CTO Digital Circus, Inc. Vice-master CTO Tokyo, Japan @tomzoh

Slide 3

Slide 3 text

ライフワーク: Web / iOSアプリ開発, ビール, 電子工作,
 サッカー観戦, レンタルカートレース, … 長谷川 智希 Web / iOS App Development, Beer, IoT, Watch soccer match, Rental Kart Racing, … デジタルサーカス株式会社 副団長CTO Digital Circus, Inc. Vice-master CTO Tokyo, Japan Lifeworks: @tomzoh

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

WE ARE HIRING!! Web Development with http://www.dgcircus.com Omotesando, Tokyo

Slide 7

Slide 7 text

今日のテーマ ハッシュと暗号は違うぞ! Today’s theme

Slide 8

Slide 8 text

• 実際にあったやりとり:

Slide 9

Slide 9 text

• 実際にあったやりとり: お客さま「セキュリティ上DBにパスワードを保存しないで。」

Slide 10

Slide 10 text

• 実際にあったやりとり: お客さま「セキュリティ上DBにパスワードを保存しないで。」 ベンダ「ではパスワードは暗号化して保存しましょう。」

Slide 11

Slide 11 text

• 実際にあったやりとり: お客さま「セキュリティ上DBにパスワードを保存しないで。」 ベンダ「ではパスワードは暗号化して保存しましょう。」 ぼく「まって!!!! 」

Slide 12

Slide 12 text

• 実際にあったやりとり: • 本当にそこは暗号化?ハッシュじゃなくて? お客さま「セキュリティ上DBにパスワードを保存しないで。」 ベンダ「ではパスワードは暗号化して保存しましょう。」 ぼく「まって!!!! 」

Slide 13

Slide 13 text

• 実際にあったやりとり: • 本当にそこは暗号化?ハッシュじゃなくて? お客さま「セキュリティ上DBにパスワードを保存しないで。」 ベンダ「ではパスワードは暗号化して保存しましょう。」 ぼく「まって!!!! 」 • 「ハッシュと暗号化は違うぞ!」

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

今日のテーマ ハッシュと暗号は違うぞ! Today’s theme

Slide 17

Slide 17 text

ハッシュとは何か

Slide 18

Slide 18 text

ハッシュ

Slide 19

Slide 19 text

ハッシュ ハッシュ関数 ハッシュ値

Slide 20

Slide 20 text

ハッシュ関数 • 関数:

Slide 21

Slide 21 text

ハッシュ関数 • 関数: sin(θ), cos(θ), f(x)

Slide 22

Slide 22 text

ハッシュ関数 • 関数: sin(θ), cos(θ), f(x) • ハッシュ関数

Slide 23

Slide 23 text

ハッシュ関数 • 関数: sin(θ), cos(θ), f(x) • データをハッシュ関数に入力するとハッシュ値 が出力される。 • ハッシュ関数

Slide 24

Slide 24 text

ハッシュ関数 • 関数: sin(θ), cos(θ), f(x) • データをハッシュ関数に入力するとハッシュ値 が出力される。 • ハッシュ関数の例: • ハッシュ関数

Slide 25

Slide 25 text

ハッシュ関数 • 関数: sin(θ), cos(θ), f(x) md5, sha-1, sha-512 • データをハッシュ関数に入力するとハッシュ値 が出力される。 • ハッシュ関数の例: • ハッシュ関数

Slide 26

Slide 26 text

• データをハッシュ関数に入力するとハッシュ値 が出力される。

Slide 27

Slide 27 text

• データをハッシュ関数に入力するとハッシュ値 が出力される。 sha1

Slide 28

Slide 28 text

• データをハッシュ関数に入力するとハッシュ値 が出力される。 PHPカンファレンス関西 sha1

Slide 29

Slide 29 text

• データをハッシュ関数に入力するとハッシュ値 が出力される。 e35257f41406f46cf884ac9c6af27707bf5c5d05 PHPカンファレンス関西 sha1

Slide 30

Slide 30 text

ハッシュ関数の特徴

Slide 31

Slide 31 text

ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない

Slide 32

Slide 32 text

任意長のデータから 固定長のハッシュ値を出力する

Slide 33

Slide 33 text

任意長のデータから固定長のハッシュ値を出力する sha1

Slide 34

Slide 34 text

任意長のデータから固定長のハッシュ値を出力する PHPカンファレンス関西 sha1

Slide 35

Slide 35 text

任意長のデータから固定長のハッシュ値を出力する e35257f41406f46cf884ac9c6af27707bf5c5d05 PHPカンファレンス関西 sha1

Slide 36

Slide 36 text

任意長のデータから固定長のハッシュ値を出力する e35257f41406f46cf884ac9c6af27707bf5c5d05 PHPカンファレンス関西 sha1 31bytes

Slide 37

Slide 37 text

任意長のデータから固定長のハッシュ値を出力する e35257f41406f46cf884ac9c6af27707bf5c5d05 PHPカンファレンス関西 sha1 31bytes 160bits

Slide 38

Slide 38 text

吾輩は猫である…ありがたいありがたい。 sha1 任意長のデータから固定長のハッシュ値を出力する

Slide 39

Slide 39 text

吾輩は猫である…ありがたいありがたい。 sha1 275kbytes 任意長のデータから固定長のハッシュ値を出力する

Slide 40

Slide 40 text

beb2bc58c7cac6510ce0638a4e8ae3f05e51b60c 吾輩は猫である…ありがたいありがたい。 sha1 275kbytes 任意長のデータから固定長のハッシュ値を出力する

Slide 41

Slide 41 text

beb2bc58c7cac6510ce0638a4e8ae3f05e51b60c 吾輩は猫である…ありがたいありがたい。 sha1 275kbytes 160bits 任意長のデータから固定長のハッシュ値を出力する

Slide 42

Slide 42 text

同じデータからは 同じハッシュ値を出力する

Slide 43

Slide 43 text

同じデータからは同じハッシュ値を出力する sha1

Slide 44

Slide 44 text

同じデータからは同じハッシュ値を出力する sha1 86f7…67b8 データ1

Slide 45

Slide 45 text

同じデータからは同じハッシュ値を出力する sha1 86f7…67b8 86f7…67b8 データ1 データ1

Slide 46

Slide 46 text

同じデータからは同じハッシュ値を出力する sha1 86f7…67b8 86f7…67b8 86f7…67b8 データ1 データ1 データ1

Slide 47

Slide 47 text

別のデータからは だいたい別のハッシュ値を出力する

Slide 48

Slide 48 text

別のデータからはだいたい別のハッシュ値を出力する sha1

Slide 49

Slide 49 text

別のデータからはだいたい別のハッシュ値を出力する sha1 86f7…67b8 データ1

Slide 50

Slide 50 text

別のデータからはだいたい別のハッシュ値を出力する sha1 86f7…67b8 e9d71…8f98 データ1 データ2

Slide 51

Slide 51 text

別のデータからはだいたい別のハッシュ値を出力する sha1 86f7…67b8 e9d71…8f98 84a5…dbb4 データ1 データ2 データ3

Slide 52

Slide 52 text

ハッシュ値から 元のデータを算出することはほぼ出来ない

Slide 53

Slide 53 text

ハッシュ値から元のデータを算出することはほぼ出来ない sha1

Slide 54

Slide 54 text

ハッシュ値から元のデータを算出することはほぼ出来ない sha1 データ1

Slide 55

Slide 55 text

ハッシュ値から元のデータを算出することはほぼ出来ない sha1 データ1 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8

Slide 56

Slide 56 text

ハッシュ値から元のデータを算出することはほぼ出来ない sha1 データ1 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 データ1

Slide 57

Slide 57 text

ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない

Slide 58

Slide 58 text

ハッシュ関数の利用

Slide 59

Slide 59 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」  Web Site

Slide 60

Slide 60 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」 配布ファイル  Web Site

Slide 61

Slide 61 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」 配布ファイル  86f7…67b8 sha1 Web Site 配布ファイルから ハッシュ値を計算

Slide 62

Slide 62 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」 配布ファイル  86f7…67b8 sha1 Web Site 86f7…67b8 配布ファイルとsha1を Webにアップ

Slide 63

Slide 63 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」 配布ファイル  86f7…67b8 sha1 Web Site 86f7…67b8

Slide 64

Slide 64 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」 配布ファイル  86f7…67b8 sha1 Web Site 86f7…67b8 

Slide 65

Slide 65 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」 配布ファイル  86f7…67b8 sha1 Web Site 86f7…67b8  配布ファイルを ダウンロード

Slide 66

Slide 66 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」 配布ファイル  86f7…67b8 sha1 Web Site 86f7…67b8  86f7…67b8 sha1 ダウンロードした ファイルから ハッシュ値を計算

Slide 67

Slide 67 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」 配布ファイル  86f7…67b8 sha1 Web Site 86f7…67b8  86f7…67b8 sha1 ハッシュ値を比較

Slide 68

Slide 68 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」 配布ファイル  86f7…67b8 sha1 Web Site 86f7…67b8  86f7…67b8 sha1 ハッシュ値を比較 「ハッシュ値が同一」 → 「ちゃんとダウンロードできた」

Slide 69

Slide 69 text

UbuntuのISO配布サイト

Slide 70

Slide 70 text

UbuntuのISO配布サイト

Slide 71

Slide 71 text

UbuntuのISO配布サイト c94d54942a2954cf852884d656224186 *ubuntu-16.04-desktop-amd64.iso 610c4a399df39a78866f9236b8c658da *ubuntu-16.04-desktop-i386.iso 23e97cd5d4145d4105fbf29878534049 *ubuntu-16.04-server-amd64.img 23e97cd5d4145d4105fbf29878534049 *ubuntu-16.04-server-amd64.iso 494c03028524dff2de5c41a800674692 *ubuntu-16.04-server-i386.img 494c03028524dff2de5c41a800674692 *ubuntu-16.04-server-i386.iso 17643c29e3c4609818f26becf76d29a3 *ubuntu-16.04.1-desktop-amd64.iso 9e4e30c37c99b4e029b4bfc2ee93eec2 *ubuntu-16.04.1-desktop-i386.iso d2d939ca0e65816790375f6826e4032f *ubuntu-16.04.1-server-amd64.img d2d939ca0e65816790375f6826e4032f *ubuntu-16.04.1-server-amd64.iso 455206c599c25d6a576ba23ca906741a *ubuntu-16.04.1-server-i386.img 455206c599c25d6a576ba23ca906741a *ubuntu-16.04.1-server-i386.iso

Slide 72

Slide 72 text

推測しにくいURLの生成 「/user/1とか、IDがURLに丸見えなの、カッコ
 悪いな…」  id username … 1 bob … 2 jones … : : : … https://example.com/user/1

Slide 73

Slide 73 text

推測しにくいURLの生成 「/user/1とか、IDがURLに丸見えなの、カッコ
 悪いな…」  id username hash … 1 bob 4818…920a … 2 jones 4c46…3902 … : : : … https://example.com/user/4c46bc790ffe655a1e65acfacf95da50cd4d3902

Slide 74

Slide 74 text

ログインパスワードの保存 よくあるログインのフローはこんな: • ユーザはユーザ名とパスワードを入力 • システムはDBからユーザ名でレコードを探す • 見つけたレコードのパスワードと
 入力されたパスワードが一致すればログインOK!

Slide 75

Slide 75 text

 username password bob ●●● Login

Slide 76

Slide 76 text

 id username password … 1 bob M2teM2P0 … 2 jones tqigg75Y … : : : …  username password bob ●●● Login

Slide 77

Slide 77 text

 id username password … 1 bob M2teM2P0 … 2 jones tqigg75Y … : : : …  username password bob ●●● Login

Slide 78

Slide 78 text

 id username password … 1 bob M2teM2P0 … 2 jones tqigg75Y … : : : …  username password bob ●●● Login

Slide 79

Slide 79 text

 id username password … 1 bob M2teM2P0 … 2 jones tqigg75Y … : : : …  username password bob ●●● Login 入力されたパスワードと DBのパスワードを比較

Slide 80

Slide 80 text

 id username password … 1 bob M2teM2P0 … 2 jones tqigg75Y … : : : …  username password bob ●●● Login 入力されたパスワードと DBのパスワードを比較 入力されたパスワードとDBのパス ワードが一致 → ログイン成功

Slide 81

Slide 81 text

「パスワードをDBにそのまま保存するの
 怖いなあ…」  id username password … 1 bob M2teM2P0 … 2 jones tqigg75Y … : : : …

Slide 82

Slide 82 text

「パスワードをDBにそのまま保存するの
 怖いなあ…」 「ユーザ登録時にユーザが設定した文字列と、
 ログイン時にユーザが入力した文字列が
 同じものだと判断できればいいんだよね。」

Slide 83

Slide 83 text

「パスワードそのものじゃなくて、
 パスワードのハッシュ値を保存しておこう!」

Slide 84

Slide 84 text

 id username hashed_password … 1 bob 3c65…1d8b … 2 jones d578…fa1f … : : : … 「パスワードそのものじゃなくて、
 パスワードのハッシュ値を保存しておこう!」 パスワードのハッシュ値

Slide 85

Slide 85 text

 username password bob ●●● Signup

Slide 86

Slide 86 text

 username password bob ●●● Signup 入力されたパスワードを ハッシュ化 3c65…1d8b sha1

Slide 87

Slide 87 text

 id username hashed_password … 1 bob 3c65…1d8b … 2 jones d578…fa1f … : : : …  username password bob ●●● Signup 3c65…1d8b sha1 DBにはハッシュ化されたパスワードを保存

Slide 88

Slide 88 text

 id username hashed_password … 1 bob 3c65…1d8b … 2 jones d578…fa1f … : : : …  username password bob ●●● Login

Slide 89

Slide 89 text

 id username hashed_password … 1 bob 3c65…1d8b … 2 jones d578…fa1f … : : : …  username password bob ●●● Login

Slide 90

Slide 90 text

 id username hashed_password … 1 bob 3c65…1d8b … 2 jones d578…fa1f … : : : …  username password bob ●●● Login

Slide 91

Slide 91 text

 id username hashed_password … 1 bob 3c65…1d8b … 2 jones d578…fa1f … : : : …  username password bob ●●● Login 入力されたパスワードを ハッシュ化 3c65…1d8b sha1

Slide 92

Slide 92 text

 id username hashed_password … 1 bob 3c65…1d8b … 2 jones d578…fa1f … : : : …  username password bob ●●● Login 3c65…1d8b sha1 入力されたパスワードを ハッシュ化したものと DBに保存されたものを比較

Slide 93

Slide 93 text

 id username hashed_password … 1 bob 3c65…1d8b … 2 jones d578…fa1f … : : : …  username password bob ●●● Login 入力されたパスワードをハッシュ化したものと DBに保存されたハッシュ化したパスワードが一致 → ログイン成功 3c65…1d8b sha1 入力されたパスワードを ハッシュ化したものと DBに保存されたものを比較

Slide 94

Slide 94 text

DBにパスワードそのものが 保存されている必要は無い

Slide 95

Slide 95 text

ログイン処理に パスワードそのものが必要な訳でも無い

Slide 96

Slide 96 text

ハッシュ化された パスワードがあれば良い。 (もとに戻せなくても)

Slide 97

Slide 97 text

ハッシュ、便利ですね!

Slide 98

Slide 98 text

ハッシュ値の衝突

Slide 99

Slide 99 text

ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない

Slide 100

Slide 100 text

ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない

Slide 101

Slide 101 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer

Slide 102

Slide 102 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する

Slide 103

Slide 103 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 4,294,967,296通り 任意長のデータから2bitの ハッシュ値を出力する

Slide 104

Slide 104 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 4通り sha-beer 4,294,967,296通り 任意長のデータから2bitの ハッシュ値を出力する

Slide 105

Slide 105 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する

Slide 106

Slide 106 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する

Slide 107

Slide 107 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する

Slide 108

Slide 108 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する

Slide 109

Slide 109 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する

Slide 110

Slide 110 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する

Slide 111

Slide 111 text

元データ 32bit data 1 data 2 data 3 data 4 data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 衝突! 任意長のデータから2bitの ハッシュ値を出力する

Slide 112

Slide 112 text

ハッシュ値の衝突 • ハッシュ値は必ず衝突する

Slide 113

Slide 113 text

ハッシュ値の衝突 • ハッシュ値は必ず衝突する • ハッシュを使う場合は衝突したら困るか困らないかを
 必ず考える。

Slide 114

Slide 114 text

ハッシュ値の衝突 • ハッシュ値は必ず衝突する • ハッシュを使う場合は衝突したら困るか困らないかを
 必ず考える。 • 推測しにくいURLの生成の例:

Slide 115

Slide 115 text

ハッシュ値の衝突 • ハッシュ値は必ず衝突する • ハッシュを使う場合は衝突したら困るか困らないかを
 必ず考える。 • 推測しにくいURLの生成の例: 衝突したら困る

Slide 116

Slide 116 text

ハッシュ値の衝突 • ハッシュ値は必ず衝突する • ハッシュを使う場合は衝突したら困るか困らないかを
 必ず考える。 • 推測しにくいURLの生成の例: 衝突したら困る • ログインパスワードの保存:

Slide 117

Slide 117 text

ハッシュ値の衝突 • ハッシュ値は必ず衝突する • ハッシュを使う場合は衝突したら困るか困らないかを
 必ず考える。 • 推測しにくいURLの生成の例: 衝突したら困る • ログインパスワードの保存: 衝突しても困らない

Slide 118

Slide 118 text

「ハッシュ値の衝突」による攻撃

Slide 119

Slide 119 text

ファイルの同一性チェック 「ダウンロードしてきたファイル、
 ちゃんとダウンロードできたかな…」  86f7…67b8 sha1 Web Site 86f7…67b8  86f7…67b8 sha1 「ハッシュ値が同一」 → 「ちゃんとダウンロードできた」

Slide 120

Slide 120 text

ハッシュ値衝突による攻撃 神ソフトができたので公開するよ。 ハッシュ値付きね。

Slide 121

Slide 121 text

ハッシュ値衝突による攻撃 神ソフトができたので公開するよ。 ハッシュ値付きね。 ウィルス入れて…。末尾にゴミデータ付け加えて ハッシュ値同じにしてミラーサイトぽく配布。

Slide 122

Slide 122 text

ハッシュ値衝突による攻撃 ミラーサイトからダウンロードしたファイル、大丈 夫かな?…ハッシュ値合ってるしOK! 神ソフトができたので公開するよ。 ハッシュ値付きね。 ウィルス入れて…。末尾にゴミデータ付け加えて ハッシュ値同じにしてミラーサイトぽく配布。

Slide 123

Slide 123 text

ハッシュ値衝突による攻撃 ミラーサイトからダウンロードしたファイル、大丈 夫かな?…ハッシュ値合ってるしOK! 神ソフトができたので公開するよ。 ハッシュ値付きね。 ウィルス入れて…。末尾にゴミデータ付け加えて ハッシュ値同じにしてミラーサイトぽく配布。 ぎゃー!ウィルス入りだった!!!

Slide 124

Slide 124 text

ハッシュ値衝突による攻撃 ミラーサイトからダウンロードしたファイル、大丈 夫かな?…ハッシュ値合ってるしOK! 神ソフトができたので公開するよ。 ハッシュ値付きね。 ウィルス入れて…。末尾にゴミデータ付け加えて ハッシュ値同じにしてミラーサイトぽく配布。 ぎゃー!ウィルス入りだった!!! どうしたらよかった?

Slide 125

Slide 125 text

ハッシュ値衝突による攻撃の対策 • どうしようもない。 • ハッシュ値の衝突を意図的に起こしにくいアルゴ リズムを使うしかない。

Slide 126

Slide 126 text

ハッシュ値衝突による攻撃の対策 • どうしようもない。 • ハッシュ値の衝突を意図的に起こしにくいアルゴ リズムを使うしかない。

Slide 127

Slide 127 text

ハッシュの安全性

Slide 128

Slide 128 text

ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する
 4. ハッシュ値から元のデータを算出することはほぼ出来ない

Slide 129

Slide 129 text

ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する
 4. ハッシュ値から元のデータを算出することはほぼ出来ない = 衝突しにくい

Slide 130

Slide 130 text

ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する
 4. ハッシュ値から元のデータを算出することはほぼ出来ない = 衝突しにくい = 元のデータを算出しにくい

Slide 131

Slide 131 text

良いハッシュ関数の特徴 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい n

Slide 132

Slide 132 text

良いハッシュ関数の特徴 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい 計算量: 2n 計算量: 2 n 2

Slide 133

Slide 133 text

23 February, 2017

Slide 134

Slide 134 text

SHAttered の計算量 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい 計算量: 2n

Slide 135

Slide 135 text

SHAttered の計算量 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい 計算量: 2n 160 2 計算量: 2 = 280

Slide 136

Slide 136 text

SHAttered の計算量 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい 計算量: 2n 160 2 計算量: 2 = 280

Slide 137

Slide 137 text

SHAttered の計算量 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい 計算量: 2n 計算量: 263 160 2 計算量: 2 = 280

Slide 138

Slide 138 text

ハッシュを使ったシステムへの攻撃

Slide 139

Slide 139 text

「推測しにくいURLの生成」への攻撃

Slide 140

Slide 140 text

推測しにくいURLの生成 「/user/1とか、IDがURLに丸見えなの、カッコ
 悪いな…」  id username hash … 1 bob 4818…920a … 2 jones 4c46…3902 … : : : … https://example.com/user/4c46bc790ffe655a1e65acfacf95da50cd4d3902

Slide 141

Slide 141 text

原像推測による攻撃 /user/1 ってのもアレなのでハッシュ化したろ。 $url = sprintf("/user/%s", md5($userId));

Slide 142

Slide 142 text

原像推測による攻撃 /user/1 ってのもアレなのでハッシュ化したろ。 $url = sprintf("/user/%s", md5($userId)); この文字列の並び、md5だな。どうせ元は連番だろ。 for ($i = 0; $i < 1000; $i++)} $page = file_get_contents(
 sprintf("/user/%s", md5($i)));

Slide 143

Slide 143 text

原像推測による攻撃 /user/1 ってのもアレなのでハッシュ化したろ。 $url = sprintf("/user/%s", md5($userId)); この文字列の並び、md5だな。どうせ元は連番だろ。 for ($i = 0; $i < 1000; $i++)} $page = file_get_contents(
 sprintf("/user/%s", md5($i))); 全部バレた!

Slide 144

Slide 144 text

原像推測による攻撃 /user/1 ってのもアレなのでハッシュ化したろ。 $url = sprintf("/user/%s", md5($userId)); この文字列の並び、md5だな。どうせ元は連番だろ。 for ($i = 0; $i < 1000; $i++)} $page = file_get_contents(
 sprintf("/user/%s", md5($i))); 全部バレた! どうしたらよかった?

Slide 145

Slide 145 text

原像推測による攻撃の対策 • 元データがバレない様にする。

Slide 146

Slide 146 text

原像推測による攻撃の対策 • 元データがバレない様にする。 • 元データが「1」とかだからバレる。

Slide 147

Slide 147 text

原像推測による攻撃の対策 • 元データがバレない様にする。 • 元データに長い文字列(ソルト)を追加する。 • 元データが「1」とかだからバレる。

Slide 148

Slide 148 text

原像推測による攻撃の対策 • 元データがバレない様にする。 • 元データに長い文字列(ソルト)を追加する。 $salt = "aemi4ahcoh7weeN2euth"; $url = sprintf("/user/%s", md5($salt.$userId)); • 元データが「1」とかだからバレる。

Slide 149

Slide 149 text

原像推測による攻撃の対策 • 元データがバレない様にする。 • 元データに長い文字列(ソルト)を追加する。 $salt = "aemi4ahcoh7weeN2euth"; $url = sprintf("/user/%s", md5($salt.$userId)); • 攻撃者は「aemi4ahcoh7weeN2euth1」を推測しなければならなくなる。 • 「連番とかをわかりにくくする」様な用途では、ソルトを付けない形で ハッシュ関数を使うことは無いと思って良い。 • 元データが「1」とかだからバレる。

Slide 150

Slide 150 text

「ログインパスワードの保存」への攻撃

Slide 151

Slide 151 text

ログインパスワードの保存  id username hashed_password … 1 bob 3c65…1d8b … 2 jones d578…fa1f … : : : … 「パスワードそのものじゃなくて、
 パスワードのハッシュ値を保存しておこう!」 パスワードのハッシュ値

Slide 152

Slide 152 text

原像計算による攻撃 パスワードをハッシュ化してDBに保存したよ。 これでデータが漏洩しても大丈夫!

Slide 153

Slide 153 text

原像計算による攻撃 パスワードをハッシュ化してDBに保存したよ。 これでデータが漏洩しても大丈夫! この文字列の並び、md5だな。計算済みの 表を使って…。 元データ md5 abcde ab56b4d92b40713acc5af89985d4b786 qwerty d8578edf8458ce06fbc5bb76a58c5ca4 password 5f4dcc3b5aa765d61d8327deb882cf99 : :

Slide 154

Slide 154 text

原像計算による攻撃 パスワードをハッシュ化してDBに保存したよ。 これでデータが漏洩しても大丈夫! あっという間にパスワードがばれた! この文字列の並び、md5だな。計算済みの 表を使って…。 元データ md5 abcde ab56b4d92b40713acc5af89985d4b786 qwerty d8578edf8458ce06fbc5bb76a58c5ca4 password 5f4dcc3b5aa765d61d8327deb882cf99 : :

Slide 155

Slide 155 text

原像計算による攻撃 パスワードをハッシュ化してDBに保存したよ。 これでデータが漏洩しても大丈夫! あっという間にパスワードがばれた! どうしたらよかった? この文字列の並び、md5だな。計算済みの 表を使って…。 元データ md5 abcde ab56b4d92b40713acc5af89985d4b786 qwerty d8578edf8458ce06fbc5bb76a58c5ca4 password 5f4dcc3b5aa765d61d8327deb882cf99 : :

Slide 156

Slide 156 text

原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。

Slide 157

Slide 157 text

原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。 • そのために、元データにソルトを追加する。

Slide 158

Slide 158 text

原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。 • そのために、元データにソルトを追加する。 abcdeoMF0iyDQB8Bpsl6npJer9XTT7PNdCWug 607452f4c75ee977ea169e49f6c1db1c md5

Slide 159

Slide 159 text

原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。 • そのために、元データにソルトを追加する。 元データ md5 abcde ab56b4d92b40713acc5af89985 d4b786 abcdeoMF0iyDQB8Bpsl6npJer9XTT7PNdCWug 607452f4c75ee977ea169e49f6c1db1c md5

Slide 160

Slide 160 text

原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。 • そのために、元データにソルトを追加する。

Slide 161

Slide 161 text

原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。 • そのために、元データにソルトを追加する。 • 前のケースと同じ。 • ハッシュと聞いたらソルトは?と思うぐらいで良い。

Slide 162

Slide 162 text

今日のテーマ ハッシュと暗号は違うぞ! Today’s theme

Slide 163

Slide 163 text

ハッシュと暗号

Slide 164

Slide 164 text

ハッシュと暗号 ハッシュ関数によるハッシュ化 一方向 / ハッシュ値から元データに戻せないことが前提 md5, sha-1, sha-512, … n

Slide 165

Slide 165 text

ハッシュと暗号 ハッシュ関数によるハッシュ化 一方向 / ハッシュ値から元データに戻せないことが前提 md5, sha-1, sha-512, … 暗号化 / 復号 双方向 / 暗号文から平文に戻せることが前提 秘密裏に通信をすることを目的とする AES, DES, RSA n

Slide 166

Slide 166 text

みなさんは大丈夫だと思いますが

Slide 167

Slide 167 text

ハッシュも暗号化も 同じ様なもんじゃない? と思ってる人は…

Slide 168

Slide 168 text

ハッシュでも暗号でもない でもぱっと見ハッシュに似てる概念

Slide 169

Slide 169 text

たぶんこれも同一視しちゃう

Slide 170

Slide 170 text

ハッシュと暗号と心強さと 難読化 一方向 / プログラムなどを読みにくくするための変換。 結果としてファイルサイズが小さくなるので「圧縮」って呼 んだりも。 JavaScriptやJavaでよく利用される。 n 双方向 / エンコードされたものをデコードできることが前提。 鍵の要素が無いため、アルゴリズムを知っていれば誰でも元に 戻せる。 urlencode(), Base64, … エンコード / デコード

Slide 171

Slide 171 text

正しく選択しよう!

Slide 172

Slide 172 text

まとめ

Slide 173

Slide 173 text

まとめ • ハッシュ関数はデータをハッシュ値に一方向に
 変換するもの。 • ハッシュ関数を使う時は必ず… • 入力データにソルトを追加する • 衝突の可能性を考慮に入れる • 暗号化、エンコード、難読化とは違う。 • ハッシュや暗号を使う時は、なぜそれを使うか、
 なぜその判断をすべきかを考えよう。

Slide 174

Slide 174 text

Thanks WE ARE HIRING @tomzoh プリーズ: #phpkansai / ブログ / 懇親会

Slide 175

Slide 175 text

時間があれば追加エピソード

Slide 176

Slide 176 text

プログラミング言語の「ハッシュ」 ep.1

Slide 177

Slide 177 text

プログラム言語の「ハッシュ」 • PHPの配列は文字列をキーに使える。 • 他の言語でも大抵この機能はある。 • 連想配列 • ハッシュ

Slide 178

Slide 178 text

プログラム言語の「ハッシュ」 • PHPの配列は文字列をキーに使える。 • 他の言語でも大抵この機能はある。 • 連想配列 • ハッシュ

Slide 179

Slide 179 text

プログラム言語の「ハッシュ」 • PHPの配列は文字列をキーに使える。 • 他の言語でも大抵この機能はある。 • 連想配列 • ハッシュ

Slide 180

Slide 180 text

何故「ハッシュ」?

Slide 181

Slide 181 text

連想配列の実装

Slide 182

Slide 182 text

$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ

Slide 183

Slide 183 text

$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto

Slide 184

Slide 184 text

$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto

Slide 185

Slide 185 text

$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji

Slide 186

Slide 186 text

$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji

Slide 187

Slide 187 text

$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji

Slide 188

Slide 188 text

$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji

Slide 189

Slide 189 text

$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji

Slide 190

Slide 190 text

$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji

Slide 191

Slide 191 text

$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji

Slide 192

Slide 192 text

$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji

Slide 193

Slide 193 text

$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji

Slide 194

Slide 194 text

$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji 0x1200

Slide 195

Slide 195 text

$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200

Slide 196

Slide 196 text

echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200

Slide 197

Slide 197 text

echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200

Slide 198

Slide 198 text

echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 sha-beer

Slide 199

Slide 199 text

echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer

Slide 200

Slide 200 text

echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer

Slide 201

Slide 201 text

echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer

Slide 202

Slide 202 text

echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer

Slide 203

Slide 203 text

echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer

Slide 204

Slide 204 text

O(1)

Slide 205

Slide 205 text

あれ、衝突は?

Slide 206

Slide 206 text

もちろんあります

Slide 207

Slide 207 text

$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200

Slide 208

Slide 208 text

$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200

Slide 209

Slide 209 text

$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200 okazaki:shinji

Slide 210

Slide 210 text

$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200 okazaki:shinji

Slide 211

Slide 211 text

$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200 okazaki:shinji

Slide 212

Slide 212 text

$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto sha-beer 0x1200 okazaki:shinji

Slide 213

Slide 213 text

$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto sha-beer 0x1200 okazaki:shinji

Slide 214

Slide 214 text

$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto sha-beer 0x1200 okazaki:shinji

Slide 215

Slide 215 text

$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto sha-beer 0x1200 okazaki:shinji 衝突!

Slide 216

Slide 216 text

hashdos ep.2

Slide 217

Slide 217 text

hashdos • PHPやRubyなどWebアプリで使用する言語では、 GETやPOSTのパラメタ、Cookieを連想配列に格納 してWebアプリに引き渡す。 kagawa shinji Submit

Slide 218

Slide 218 text

hashdos • PHPやRubyなどWebアプリで使用する言語では、 GETやPOSTのパラメタ、Cookieを連想配列に格納 してWebアプリに引き渡す。 kagawa shinji Submit $_POST = [ ‘familyName’ => ’kagawa’, ‘firstName’ => ’shinji’, ];

Slide 219

Slide 219 text

hashdos • GETやPOSTのパラメタ名、Cookie名が連想配列の キーになる。 • GETやPOSTのパラメタ名、Cookie名はブラウザ側 から任意に指定可能。

Slide 220

Slide 220 text

hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’ ]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’,

Slide 221

Slide 221 text

hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’ ]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’,

Slide 222

Slide 222 text

hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’ ]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’, 外部から任意に作成可能

Slide 223

Slide 223 text

hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’ ]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’, 外部から任意に作成可能 すべてのキーを 衝突させると? ?

Slide 224

Slide 224 text

hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’ ]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’, 外部から任意に作成可能 すべてのキーを 衝突させると? ? 著しくパフォー マンスが低下する

Slide 225

Slide 225 text

demo http://koto.github.io/blog-kotowicz-net-examples/hashcollision/kill.html

Slide 226

Slide 226 text

原像計算攻撃 ep.3

Slide 227

Slide 227 text

ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない

Slide 228

Slide 228 text

23 February, 2017

Slide 229

Slide 229 text

sha1が破られる is 一大事

Slide 230

Slide 230 text

sha1が破られる is 一大事 ただし一定の条件下で

Slide 231

Slide 231 text

No content

Slide 232

Slide 232 text

No content

Slide 233

Slide 233 text

本当?

Slide 234

Slide 234 text

ハッシュ値の原像計算 • ハッシュ値の原像計算の原則は総当たり • 160ビットのハッシュ値の原像計算の計算量は 2^160。 • 元データのパターンが少なかったら? • 携帯の番号って 0[5, 7, 9]0-[0-9]{8} ぐらいし か無い。(010もあったっけ?) • 3億通り

Slide 235

Slide 235 text

Slide 236

Slide 236 text

原像計算攻撃は総当たりベース

Slide 237

Slide 237 text

ハッシュ化されたパスワードが 流出しても比較的大丈夫なのは パスワードは文字数や文字種の バリエーションが多いから。

Slide 238

Slide 238 text

巨人の肩に乗る ep.4

Slide 239

Slide 239 text

「パスワードのハッシュ化」とか
 難しいところはたいてい
 頭いい人が考えて仕組みを 作ってくれている

Slide 240

Slide 240 text

巨人の肩に乗ろう

Slide 241

Slide 241 text

ただし

Slide 242

Slide 242 text

中身を理解せずに なんとなく使うのは最悪

Slide 243

Slide 243 text

意味が無いだけなら良いが、 せっかく考えられた仕組みを 殺すことにもなり得る

Slide 244

Slide 244 text

例えば…

Slide 245

Slide 245 text

No content

Slide 246

Slide 246 text

No content

Slide 247

Slide 247 text

No content

Slide 248

Slide 248 text

自分は何をしたいのか 「巨人」は何を与えてくれているのか ちゃんと理解して、正しく使おう

Slide 249

Slide 249 text

そして…

Slide 250

Slide 250 text

この手の 「特定の製品に依存しない知識」は エンジニアの血となり肉となり、 エンジニアとして生きていくための 力になる

Slide 251

Slide 251 text

「力が…欲しいか…」

Slide 252

Slide 252 text

こういう知識をどうやって得るか • ハッシュに限らず、ソフトウェア開発には多くの 周辺知識が必要。 • 情報系の大学や専門学校では教わる(はず)。 • 体系的に広く学ぶのであれば資格試験が便利。 • IPA(情報処理推進機構)の
 「情報処理技術者試験」がおすすめ。 http://www.jitec.ipa.go.jp

Slide 253

Slide 253 text

共通鍵暗号と公開鍵暗号 ep.5

Slide 254

Slide 254 text

共通鍵方式暗号   信頼できない 通信路 信頼できる 通信路

Slide 255

Slide 255 text

共通鍵方式暗号   信頼できない 通信路 信頼できる 通信路 鍵を事前に共有

Slide 256

Slide 256 text

共通鍵方式暗号   ƪ 信頼できない 通信路 鍵を使って暗号化 信頼できる 通信路 鍵を事前に共有

Slide 257

Slide 257 text

共通鍵方式暗号   ƪ ƪ 信頼できない 通信路 鍵を使って暗号化 信頼できる 通信路 鍵を事前に共有

Slide 258

Slide 258 text

共通鍵方式暗号   ƪ ƪ 信頼できない 通信路 鍵を使って暗号化 暗号化に使ったのと 同じ鍵を使って復号 信頼できる 通信路 鍵を事前に共有

Slide 259

Slide 259 text

公開鍵方式暗号   信頼できない 通信路

Slide 260

Slide 260 text

公開鍵方式暗号   信頼できない 通信路 公開鍵を事前に共有

Slide 261

Slide 261 text

公開鍵方式暗号   ƪ 信頼できない 通信路 相手の公開鍵を 使って暗号化 公開鍵を事前に共有

Slide 262

Slide 262 text

公開鍵方式暗号   ƪ ƪ 信頼できない 通信路 相手の公開鍵を 使って暗号化 自分の秘密鍵を 使って復号 公開鍵を事前に共有

Slide 263

Slide 263 text

小ネタ集 ep.6

Slide 264

Slide 264 text

妥当なソルト • ソルトとして妥当な文字列は何か • 長さが一定以上あることだけど… • 長いソルトはハッシュ関数に入力するデータの情報量を増や す。 • 情報量が増えると衝突を起こしやすくなるかもしれない。 • 一般的に使用されるハッシュ関数はこの様な「近いデータ (ソルトが同じで元データ部分だけが違うデータ)」が衝突 しにくい様に設計されている。 • 20文字程度、とか、26文字程度、とかいろいろ言われてい る。

Slide 265

Slide 265 text

encrypt / decrypt • 暗号化と復号 • 暗号化 encrypt • 復号 decrypt • 日本語では「暗号」は名詞「復号」は動詞。 • なので「暗号化」として動詞化する。 • 英語は「encrypt」も「decrypt」も動詞。 • シンプルでうらやましいね!

Slide 266

Slide 266 text

ハッシュテーブル • あらかじめ全ての文字列に対するハッシュ値を計算して おき、そこから検索する方法で高速に原像計算が可能。 元データ md5 aaaa 74b87337454200d4d33f80c4663dc5e5 aaab 4c189b020ceb022e0ecc42482802e2b8 aaac 3963a2ba65ac8eb1c6e2140460031925 : :

Slide 267

Slide 267 text

ハッシュテーブル • あらかじめ全ての文字列に対するハッシュ値を計算して おき、そこから検索する方法で高速に原像計算が可能。 • このテーブル、すごくデカい。 • 4文字で640MB、5文字で50GB、8文字で12PB。 • テーブルを小さくするためにレインボーテーブルという
 方法がある。 元データ md5 aaaa 74b87337454200d4d33f80c4663dc5e5 aaab 4c189b020ceb022e0ecc42482802e2b8 aaac 3963a2ba65ac8eb1c6e2140460031925 : :

Slide 268

Slide 268 text

Thanks WE ARE HIRING @tomzoh プリーズ: #phpkansai / ブログ / 懇親会

Slide 269

Slide 269 text

告知

Slide 270

Slide 270 text

iOSDC Japan 2017 https://iosdc.jp/2017/ チケット販売中 2017.09.15(金)〜17(日)

Slide 271

Slide 271 text

PHPerKaigi 2018 https://phperkaigi.jp スポンサー募集…するかも 2018.03.10(土) • PHPerのためのカンファレンス • 東京都練馬区 Coconeriホールにて • 朝から晩までテックトーク • 夕方からはビールを飲みながら • 夜はクラフトビールで懇親会

Slide 272

Slide 272 text

Thanks WE ARE HIRING @tomzoh プリーズ: #phpkansai / ブログ / 懇親会