ハッシュと暗号は違うぞ! PHPカンファレンス関西2017 / Hash or Encryption

ハッシュと暗号は違うぞ! PHPカンファレンス関西2017 / Hash or Encryption

PHPカンファレンス関西 2017の発表資料です

40575ebf9c2f4a6e3bcb68630f446a3b?s=128

HASEGAWA Tomoki

July 15, 2017
Tweet

Transcript

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

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

    Japan @tomzoh
  3. ライフワーク: 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
  4. None
  5. None
  6. WE ARE HIRING!! Web Development with http://www.dgcircus.com Omotesando, Tokyo

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

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

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

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

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

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

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

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

  17. ハッシュとは何か

  18. ハッシュ

  19. ハッシュ ハッシュ関数 ハッシュ値

  20. ハッシュ関数 • 関数:

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

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

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

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

    ハッシュ関数の例: • ハッシュ関数
  25. ハッシュ関数 • 関数: sin(θ), cos(θ), f(x) md5, sha-1, sha-512 •

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

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

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

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

  30. ハッシュ関数の特徴

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  58. ハッシュ関数の利用

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

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

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

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

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

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

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

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

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

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

     86f7…67b8 sha1 ハッシュ値を比較 「ハッシュ値が同一」 → 「ちゃんとダウンロードできた」
  69. UbuntuのISO配布サイト

  70. UbuntuのISO配布サイト

  71. 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
  72. 推測しにくいURLの生成 「/user/1とか、IDがURLに丸見えなの、カッコ
 悪いな…」  id username … 1 bob …

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

    4818…920a … 2 jones 4c46…3902 … : : : … https://example.com/user/4c46bc790ffe655a1e65acfacf95da50cd4d3902
  74. ログインパスワードの保存 よくあるログインのフローはこんな: • ユーザはユーザ名とパスワードを入力 • システムはDBからユーザ名でレコードを探す • 見つけたレコードのパスワードと
 入力されたパスワードが一致すればログインOK!

  75.  username password bob ••• Login

  76.  id username password … 1 bob M2teM2P0 … 2

    jones tqigg75Y … : : : …  username password bob ••• Login
  77.  id username password … 1 bob M2teM2P0 … 2

    jones tqigg75Y … : : : …  username password bob ••• Login
  78.  id username password … 1 bob M2teM2P0 … 2

    jones tqigg75Y … : : : …  username password bob ••• Login
  79.  id username password … 1 bob M2teM2P0 … 2

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

    jones tqigg75Y … : : : …  username password bob ••• Login 入力されたパスワードと DBのパスワードを比較 入力されたパスワードとDBのパス ワードが一致 → ログイン成功
  81. 「パスワードをDBにそのまま保存するの
 怖いなあ…」  id username password … 1 bob M2teM2P0

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

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

  84.  id username hashed_password … 1 bob 3c65…1d8b … 2

    jones d578…fa1f … : : : … 「パスワードそのものじゃなくて、
 パスワードのハッシュ値を保存しておこう!」 パスワードのハッシュ値
  85.  username password bob ••• Signup

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

  87.  id username hashed_password … 1 bob 3c65…1d8b … 2

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

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

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

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

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

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

    jones d578…fa1f … : : : …  username password bob ••• Login 入力されたパスワードをハッシュ化したものと DBに保存されたハッシュ化したパスワードが一致 → ログイン成功 3c65…1d8b sha1 入力されたパスワードを ハッシュ化したものと DBに保存されたものを比較
  94. DBにパスワードそのものが 保存されている必要は無い

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

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

  97. ハッシュ、便利ですね!

  98. ハッシュ値の衝突

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

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

  101. 元データ 32bit data 1 data 2 data 3 data 4

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

    data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する
  103. 元データ 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の ハッシュ値を出力する
  104. 元データ 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の ハッシュ値を出力する
  105. 元データ 32bit data 1 data 2 data 3 data 4

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

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

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

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

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

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

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

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

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

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

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

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

    ログインパスワードの保存: 衝突しても困らない
  118. 「ハッシュ値の衝突」による攻撃

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

    86f7…67b8 sha1 「ハッシュ値が同一」 → 「ちゃんとダウンロードできた」
  120. ハッシュ値衝突による攻撃 神ソフトができたので公開するよ。 ハッシュ値付きね。

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

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

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

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

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

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

  127. ハッシュの安全性

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

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

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

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

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

    2n 計算量: 2 n 2
  133. 23 February, 2017

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

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

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

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

    計算量: 2n 計算量: 263 160 2 計算量: 2 = 280
  138. ハッシュを使ったシステムへの攻撃

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

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

    4818…920a … 2 jones 4c46…3902 … : : : … https://example.com/user/4c46bc790ffe655a1e65acfacf95da50cd4d3902
  141. 原像推測による攻撃 /user/1 ってのもアレなのでハッシュ化したろ。 $url = sprintf("/user/%s", md5($userId));

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

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

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

    = 0; $i < 1000; $i++)} $page = file_get_contents(
 sprintf("/user/%s", md5($i))); 全部バレた! どうしたらよかった?
  145. 原像推測による攻撃の対策 • 元データがバレない様にする。

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

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

  148. 原像推測による攻撃の対策 • 元データがバレない様にする。 • 元データに長い文字列(ソルト)を追加する。 $salt = "aemi4ahcoh7weeN2euth"; $url =

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

    sprintf("/user/%s", md5($salt.$userId)); • 攻撃者は「aemi4ahcoh7weeN2euth1」を推測しなければならなくなる。 • 「連番とかをわかりにくくする」様な用途では、ソルトを付けない形で ハッシュ関数を使うことは無いと思って良い。 • 元データが「1」とかだからバレる。
  150. 「ログインパスワードの保存」への攻撃

  151. ログインパスワードの保存  id username hashed_password … 1 bob 3c65…1d8b …

    2 jones d578…fa1f … : : : … 「パスワードそのものじゃなくて、
 パスワードのハッシュ値を保存しておこう!」 パスワードのハッシュ値
  152. 原像計算による攻撃 パスワードをハッシュ化してDBに保存したよ。 これでデータが漏洩しても大丈夫!

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

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

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

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

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

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

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

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

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

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

  163. ハッシュと暗号

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

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

    / 復号 双方向 / 暗号文から平文に戻せることが前提 秘密裏に通信をすることを目的とする AES, DES, RSA n
  166. みなさんは大丈夫だと思いますが

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

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

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

  170. ハッシュと暗号と心強さと 難読化 一方向 / プログラムなどを読みにくくするための変換。 結果としてファイルサイズが小さくなるので「圧縮」って呼 んだりも。 JavaScriptやJavaでよく利用される。 n 双方向

    / エンコードされたものをデコードできることが前提。 鍵の要素が無いため、アルゴリズムを知っていれば誰でも元に 戻せる。 urlencode(), Base64, … エンコード / デコード
  171. 正しく選択しよう!

  172. まとめ

  173. まとめ • ハッシュ関数はデータをハッシュ値に一方向に
 変換するもの。 • ハッシュ関数を使う時は必ず… • 入力データにソルトを追加する • 衝突の可能性を考慮に入れる

    • 暗号化、エンコード、難読化とは違う。 • ハッシュや暗号を使う時は、なぜそれを使うか、
 なぜその判断をすべきかを考えよう。
  174. Thanks WE ARE HIRING @tomzoh プリーズ: #phpkansai / ブログ /

    懇親会
  175. 時間があれば追加エピソード

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

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

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

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

  180. 何故「ハッシュ」?

  181. 連想配列の実装

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

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

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

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

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

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

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

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

    0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji
  190. $array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02

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

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

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

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

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

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

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

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

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

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

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

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

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

    0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer
  204. O(1)

  205. あれ、衝突は?

  206. もちろんあります

  207. $array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02

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

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

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

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

    0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200 okazaki:shinji
  212. $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
  213. $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
  214. $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
  215. $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 衝突!
  216. hashdos ep.2

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

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

    [ ‘familyName’ => ’kagawa’, ‘firstName’ => ’shinji’, ];
  219. hashdos • GETやPOSTのパラメタ名、Cookie名が連想配列の キーになる。 • GETやPOSTのパラメタ名、Cookie名はブラウザ側 から任意に指定可能。

  220. hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’

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

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

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

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

    ]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’, 外部から任意に作成可能 すべてのキーを 衝突させると? ? 著しくパフォー マンスが低下する
  225. demo http://koto.github.io/blog-kotowicz-net-examples/hashcollision/kill.html

  226. 原像計算攻撃 ep.3

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

  228. 23 February, 2017

  229. sha1が破られる is 一大事

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

  231. None
  232. None
  233. 本当?

  234. ハッシュ値の原像計算 • ハッシュ値の原像計算の原則は総当たり • 160ビットのハッシュ値の原像計算の計算量は 2^160。 • 元データのパターンが少なかったら? • 携帯の番号って

    0[5, 7, 9]0-[0-9]{8} ぐらいし か無い。(010もあったっけ?) • 3億通り
  235. <?php $salt = 'iAakR1rFT2CzRWvV'; $plain = '09012345678'; $hashed = sha1($salt.$plain);

    foreach ([5, 7, 9] as $second){ for ($i = 0; $i <= 99999999; $i++){ $check = sprintf("0%d0%08d", $second, $i); if (sha1($salt.$check) == $hashed){ printf("Got it! Plain text is %s".PHP_EOL, $check); return; } } }
  236. 原像計算攻撃は総当たりベース

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

  238. 巨人の肩に乗る ep.4

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

  240. 巨人の肩に乗ろう

  241. ただし

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

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

  244. 例えば…

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

  249. そして…

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

  251. 「力が…欲しいか…」

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


    「情報処理技術者試験」がおすすめ。 http://www.jitec.ipa.go.jp
  253. 共通鍵暗号と公開鍵暗号 ep.5

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

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

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

  257. 共通鍵方式暗号   ƪ ƪ 信頼できない 通信路 鍵を使って暗号化 信頼できる 通信路

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

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

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

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

  262. 公開鍵方式暗号   ƪ ƪ 信頼できない 通信路 相手の公開鍵を 使って暗号化 自分の秘密鍵を

    使って復号 公開鍵を事前に共有
  263. 小ネタ集 ep.6

  264. 妥当なソルト • ソルトとして妥当な文字列は何か • 長さが一定以上あることだけど… • 長いソルトはハッシュ関数に入力するデータの情報量を増や す。 • 情報量が増えると衝突を起こしやすくなるかもしれない。

    • 一般的に使用されるハッシュ関数はこの様な「近いデータ (ソルトが同じで元データ部分だけが違うデータ)」が衝突 しにくい様に設計されている。 • 20文字程度、とか、26文字程度、とかいろいろ言われてい る。
  265. encrypt / decrypt • 暗号化と復号 • 暗号化 encrypt • 復号

    decrypt • 日本語では「暗号」は名詞「復号」は動詞。 • なので「暗号化」として動詞化する。 • 英語は「encrypt」も「decrypt」も動詞。 • シンプルでうらやましいね!
  266. ハッシュテーブル • あらかじめ全ての文字列に対するハッシュ値を計算して おき、そこから検索する方法で高速に原像計算が可能。 元データ md5 aaaa 74b87337454200d4d33f80c4663dc5e5 aaab 4c189b020ceb022e0ecc42482802e2b8

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


    方法がある。 元データ md5 aaaa 74b87337454200d4d33f80c4663dc5e5 aaab 4c189b020ceb022e0ecc42482802e2b8 aaac 3963a2ba65ac8eb1c6e2140460031925 : :
  268. Thanks WE ARE HIRING @tomzoh プリーズ: #phpkansai / ブログ /

    懇親会
  269. 告知

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

  271. PHPerKaigi 2018 https://phperkaigi.jp スポンサー募集…するかも 2018.03.10(土) • PHPerのためのカンファレンス • 東京都練馬区 Coconeriホールにて

    • 朝から晩までテックトーク • 夕方からはビールを飲みながら • 夜はクラフトビールで懇親会
  272. Thanks WE ARE HIRING @tomzoh プリーズ: #phpkansai / ブログ /

    懇親会