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 Slide

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

    View 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 Slide

  4. View Slide

  5. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    View Slide

  14. View Slide

  15. View Slide

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

    View Slide

  17. ハッシュとは何か

    View Slide

  18. ハッシュ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  30. ハッシュ関数の特徴

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  58. ハッシュ関数の利用

    View Slide

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

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

    Web Site

    View Slide

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

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

    Web Site

    View Slide

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

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

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

    View Slide

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

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

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

    View Slide

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

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

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

    View Slide

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

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

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

    View Slide

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

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

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

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

    View Slide

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

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

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

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

    View Slide

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

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

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

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

    View Slide

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

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

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

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

    View Slide

  69. UbuntuのISO配布サイト

    View Slide

  70. UbuntuのISO配布サイト

    View Slide

  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

    View Slide

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

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

    View Slide

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

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

    View Slide

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

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

    View Slide

  75.  username
    password
    bob
    ●●●
    Login

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    View Slide

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

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

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

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

    View Slide

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

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

    View Slide

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

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

    パスワードのハッシュ値

    View Slide

  85.  username
    password
    bob
    ●●●
    Signup

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  98. ハッシュ値の衝突

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

  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の
    ハッシュ値を出力する

    View Slide

  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の
    ハッシュ値を出力する

    View 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 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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    必ず考える。

    View Slide

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

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

    View Slide

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

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

    View Slide

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

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

    View Slide

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

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

    View Slide

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

    View Slide

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

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

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

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

    View Slide

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

    View Slide

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

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

    View Slide

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

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

    View Slide

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

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

    View Slide

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

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

    View Slide

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

    View Slide

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

    View Slide

  127. ハッシュの安全性

    View Slide

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

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

    View Slide

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

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

    View Slide

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

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

    View Slide

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

    View Slide

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

    View Slide

  133. 23 February, 2017

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    View Slide

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

    View Slide

  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)));

    View Slide

  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)));
    全部バレた!

    View Slide

  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)));
    全部バレた!
    どうしたらよかった?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    パスワードのハッシュ値

    View Slide

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

    View Slide

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

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

    View Slide

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

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

    View Slide

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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  163. ハッシュと暗号

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  171. 正しく選択しよう!

    View Slide

  172. まとめ

    View Slide

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

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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  180. 何故「ハッシュ」?

    View Slide

  181. 連想配列の実装

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  204. O(1)

    View Slide

  205. あれ、衝突は?

    View Slide

  206. もちろんあります

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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
    衝突!

    View Slide

  216. hashdos
    ep.2

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  226. 原像計算攻撃
    ep.3

    View Slide

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

    View Slide

  228. 23 February, 2017

    View Slide

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

    View Slide

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

    View Slide

  231. View Slide

  232. View Slide

  233. 本当?

    View Slide

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

    View Slide

  235. $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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    難しいところはたいてい

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

    View Slide

  240. 巨人の肩に乗ろう

    View Slide

  241. ただし

    View Slide

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

    View Slide

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

    View Slide

  244. 例えば…

    View Slide

  245. View Slide

  246. View Slide

  247. View Slide

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

    View Slide

  249. そして…

    View Slide

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

    View Slide

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

    View Slide

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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  263. 小ネタ集
    ep.6

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    View Slide

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

    View Slide

  269. 告知

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide