Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

HASEGAWA Tomoki

July 15, 2017
Tweet

More Decks by HASEGAWA Tomoki

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    • 「ハッシュと暗号化は違うぞ!」

    View full-size slide

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

    View full-size slide

  13. ハッシュとは何か

    View full-size slide

  14. ハッシュ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  26. ハッシュ関数の特徴

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  54. ハッシュ関数の利用

    View full-size slide

  55. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」

    Web Site

    View full-size slide

  56. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」
    配布ファイル

    Web Site

    View full-size slide

  57. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」
    配布ファイル

    86f7…67b8
    sha1
    Web Site
    配布ファイルから
    ハッシュ値を計算

    View full-size slide

  58. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」
    配布ファイル

    86f7…67b8
    sha1
    Web Site
    86f7…67b8
    配布ファイルとsha1を
    Webにアップ

    View full-size slide

  59. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」
    配布ファイル

    86f7…67b8
    sha1
    Web Site
    86f7…67b8

    View full-size slide

  60. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」
    配布ファイル

    86f7…67b8
    sha1
    Web Site
    86f7…67b8

    View full-size slide

  61. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」
    配布ファイル

    86f7…67b8
    sha1
    Web Site
    86f7…67b8

    配布ファイルを
    ダウンロード

    View full-size slide

  62. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」
    配布ファイル

    86f7…67b8
    sha1
    Web Site
    86f7…67b8

    86f7…67b8
    sha1
    ダウンロードした
    ファイルから
    ハッシュ値を計算

    View full-size slide

  63. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」
    配布ファイル

    86f7…67b8
    sha1
    Web Site
    86f7…67b8

    86f7…67b8
    sha1
    ハッシュ値を比較

    View full-size slide

  64. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」
    配布ファイル

    86f7…67b8
    sha1
    Web Site
    86f7…67b8

    86f7…67b8
    sha1
    ハッシュ値を比較
    「ハッシュ値が同一」 →
    「ちゃんとダウンロードできた」

    View full-size slide

  65. UbuntuのISO配布サイト

    View full-size slide

  66. UbuntuのISO配布サイト

    View full-size slide

  67. 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

    View full-size slide

  68. 推測しにくいURLの生成
    「/user/1とか、IDがURLに丸見えなの、カッコ

    悪いな…」
     id username …
    1 bob …
    2 jones …
    : : : …
    https://example.com/user/1

    View full-size slide

  69. 推測しにくいURLの生成
    「/user/1とか、IDがURLに丸見えなの、カッコ

    悪いな…」
     id username hash …
    1 bob 4818…920a …
    2 jones 4c46…3902 …
    : : : …
    https://example.com/user/4c46bc790ffe655a1e65acfacf95da50cd4d3902

    View full-size slide

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

    入力されたパスワードが一致すればログインOK!

    View full-size slide

  71.  username
    password
    bob
    ●●●
    Login

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  77. 「パスワードをDBにそのまま保存するの

    怖いなあ…」
     id username password …
    1 bob M2teM2P0 …
    2 jones tqigg75Y …
    : : : …

    View full-size slide

  78. 「パスワードをDBにそのまま保存するの

    怖いなあ…」
    「ユーザ登録時にユーザが設定した文字列と、

    ログイン時にユーザが入力した文字列が

    同じものだと判断できればいいんだよね。」

    View full-size slide

  79. 「パスワードそのものじゃなくて、

    パスワードのハッシュ値を保存しておこう!」

    View full-size slide

  80.  id username hashed_password …
    1 bob 3c65…1d8b …
    2 jones d578…fa1f …
    : : : …
    「パスワードそのものじゃなくて、

    パスワードのハッシュ値を保存しておこう!」

    パスワードのハッシュ値

    View full-size slide

  81.  username
    password
    bob
    ●●●
    Signup

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  94. ハッシュ値の衝突

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  99. 元データ 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の
    ハッシュ値を出力する

    View full-size slide

  100. 元データ 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の
    ハッシュ値を出力する

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    必ず考える。

    View full-size slide

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

    必ず考える。
    • 推測しにくいURLの生成の例:

    View full-size slide

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

    必ず考える。
    • 推測しにくいURLの生成の例: 衝突したら困る

    View full-size slide

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

    必ず考える。
    • 推測しにくいURLの生成の例: 衝突したら困る
    • ログインパスワードの保存:

    View full-size slide

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

    必ず考える。
    • 推測しにくいURLの生成の例: 衝突したら困る
    • ログインパスワードの保存: 衝突しても困らない

    View full-size slide

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

    View full-size slide

  115. ファイルの同一性チェック
    「ダウンロードしてきたファイル、

    ちゃんとダウンロードできたかな…」

    86f7…67b8
    sha1
    Web Site
    86f7…67b8

    86f7…67b8
    sha1
    「ハッシュ値が同一」 →
    「ちゃんとダウンロードできた」

    View full-size slide

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

    View full-size slide

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

    ウィルス入れて…。末尾にゴミデータ付け加えて
    ハッシュ値同じにしてミラーサイトぽく配布。

    View full-size slide

  118. ハッシュ値衝突による攻撃
    ミラーサイトからダウンロードしたファイル、大丈
    夫かな?…ハッシュ値合ってるしOK!
    神ソフトができたので公開するよ。
    ハッシュ値付きね。

    ウィルス入れて…。末尾にゴミデータ付け加えて
    ハッシュ値同じにしてミラーサイトぽく配布。

    View full-size slide

  119. ハッシュ値衝突による攻撃
    ミラーサイトからダウンロードしたファイル、大丈
    夫かな?…ハッシュ値合ってるしOK!
    神ソフトができたので公開するよ。
    ハッシュ値付きね。

    ウィルス入れて…。末尾にゴミデータ付け加えて
    ハッシュ値同じにしてミラーサイトぽく配布。
    ぎゃー!ウィルス入りだった!!!

    View full-size slide

  120. ハッシュ値衝突による攻撃
    ミラーサイトからダウンロードしたファイル、大丈
    夫かな?…ハッシュ値合ってるしOK!
    神ソフトができたので公開するよ。
    ハッシュ値付きね。

    ウィルス入れて…。末尾にゴミデータ付け加えて
    ハッシュ値同じにしてミラーサイトぽく配布。
    ぎゃー!ウィルス入りだった!!!
    どうしたらよかった?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  123. ハッシュの安全性

    View full-size slide

  124. ハッシュ関数の特徴
    1. 任意長のデータから固定長のハッシュ値を出力する
    2. 同じデータからは同じハッシュ値を出力する
    3. 別のデータからはだいたい別のハッシュ値を出力する

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

    View full-size slide

  125. ハッシュ関数の特徴
    1. 任意長のデータから固定長のハッシュ値を出力する
    2. 同じデータからは同じハッシュ値を出力する
    3. 別のデータからはだいたい別のハッシュ値を出力する

    4. ハッシュ値から元のデータを算出することはほぼ出来ない
    = 衝突しにくい

    View full-size slide

  126. ハッシュ関数の特徴
    1. 任意長のデータから固定長のハッシュ値を出力する
    2. 同じデータからは同じハッシュ値を出力する
    3. 別のデータからはだいたい別のハッシュ値を出力する

    4. ハッシュ値から元のデータを算出することはほぼ出来ない
    = 衝突しにくい
    = 元のデータを算出しにくい

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  129. 23 February, 2017

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  136. 推測しにくいURLの生成
    「/user/1とか、IDがURLに丸見えなの、カッコ

    悪いな…」
     id username hash …
    1 bob 4818…920a …
    2 jones 4c46…3902 …
    : : : …
    https://example.com/user/4c46bc790ffe655a1e65acfacf95da50cd4d3902

    View full-size slide

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

    View full-size slide

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

    この文字列の並び、md5だな。どうせ元は連番だろ。
    for ($i = 0; $i < 1000; $i++)}
    $page = file_get_contents(

    sprintf("/user/%s", md5($i)));

    View full-size slide

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

    この文字列の並び、md5だな。どうせ元は連番だろ。
    for ($i = 0; $i < 1000; $i++)}
    $page = file_get_contents(

    sprintf("/user/%s", md5($i)));
    全部バレた!

    View full-size slide

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

    この文字列の並び、md5だな。どうせ元は連番だろ。
    for ($i = 0; $i < 1000; $i++)}
    $page = file_get_contents(

    sprintf("/user/%s", md5($i)));
    全部バレた!
    どうしたらよかった?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  147. ログインパスワードの保存
     id username hashed_password …
    1 bob 3c65…1d8b …
    2 jones d578…fa1f …
    : : : …
    「パスワードそのものじゃなくて、

    パスワードのハッシュ値を保存しておこう!」

    パスワードのハッシュ値

    View full-size slide

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

    View full-size slide

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

    この文字列の並び、md5だな。計算済みの
    表を使って…。
    元データ md5
    abcde ab56b4d92b40713acc5af89985d4b786
    qwerty d8578edf8458ce06fbc5bb76a58c5ca4
    password 5f4dcc3b5aa765d61d8327deb882cf99
    : :

    View full-size slide

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

    この文字列の並び、md5だな。計算済みの
    表を使って…。
    元データ md5
    abcde ab56b4d92b40713acc5af89985d4b786
    qwerty d8578edf8458ce06fbc5bb76a58c5ca4
    password 5f4dcc3b5aa765d61d8327deb882cf99
    : :

    View full-size slide

  151. 原像計算による攻撃
    パスワードをハッシュ化してDBに保存したよ。
    これでデータが漏洩しても大丈夫!
    あっという間にパスワードがばれた!
    どうしたらよかった?

    この文字列の並び、md5だな。計算済みの
    表を使って…。
    元データ md5
    abcde ab56b4d92b40713acc5af89985d4b786
    qwerty d8578edf8458ce06fbc5bb76a58c5ca4
    password 5f4dcc3b5aa765d61d8327deb882cf99
    : :

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  159. ハッシュと暗号

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  167. 正しく選択しよう!

    View full-size slide

  168. まとめ
    • ハッシュ関数はデータをハッシュ値に一方向に

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

    なぜその判断をすべきかを考えよう。

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  175. 何故「ハッシュ」?

    View full-size slide

  176. 連想配列の実装

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  199. あれ、衝突は?

    View full-size slide

  200. もちろんあります

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  206. $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

    View full-size slide

  207. $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

    View full-size slide

  208. $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

    View full-size slide

  209. $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
    衝突!

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  219. 原像計算攻撃
    ep.3

    View full-size slide

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

    View full-size slide

  221. 23 February, 2017

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  225. $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;
    }
    }
    }

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  229. 「パスワードのハッシュ化」とか

    難しいところはたいてい

    頭いい人が考えて仕組みを
    作ってくれている

    View full-size slide

  230. 巨人の肩に乗ろう

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  233. 例えば…

    View full-size slide

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

    View full-size slide

  235. そして…

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    「情報処理技術者試験」がおすすめ。
    http://www.jitec.ipa.go.jp

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  249. 小ネタ集
    ep.6

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    方法がある。
    元データ md5
    aaaa 74b87337454200d4d33f80c4663dc5e5
    aaab 4c189b020ceb022e0ecc42482802e2b8
    aaac 3963a2ba65ac8eb1c6e2140460031925
    : :

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide