Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ハッシュと暗号は違うぞ! PHPカンファレンス関西2017 / Hash or Encryption
Search
HASEGAWA Tomoki
July 15, 2017
Technology
5
3.1k
ハッシュと暗号は違うぞ! PHPカンファレンス関西2017 / Hash or Encryption
PHPカンファレンス関西 2017の発表資料です
HASEGAWA Tomoki
July 15, 2017
Tweet
Share
More Decks by HASEGAWA Tomoki
See All by HASEGAWA Tomoki
asumikamというカンファレンスオーガナイザの凄さを語る / The Brilliance of Asumikam
tomzoh
1
170
なぜキャッシュメモリは速いのか 余談集 / Why is Cache Memory So Fast? Extended.
tomzoh
0
120
なぜキャッシュメモリは速いのか / Why is Cache Memory So Fast?
tomzoh
2
1.2k
PHPからはじめるコンピュータアーキテクチャ 15分ダイジェスト版 / PHP Meets Silicon: A Fun Dive into Computer Structures 15mins ver
tomzoh
2
240
PHPでXOAUTH2を使ってGmailからメールを取り込む / Getting Mail from Gmail with XOAUTH2 in PHP
tomzoh
0
460
PHPからはじめるコンピュータア ーキテクチャ / PHP Meets Silicon: A Fun Dive into Computer Structures PHP Conference 2023 ver
tomzoh
0
370
PHPからはじめるコンピュータア ーキテクチャ / PHP Meets Silicon: A Fun Dive into Computer Structures
tomzoh
4
610
NANDがあればNANDeもできる / With NAND, you can do anything
tomzoh
0
470
コンピュータはなぜ0と1なのか / How and Why Computers Operate Using Binary Code
tomzoh
0
420
Other Decks in Technology
See All in Technology
リモートだからこそ 懸念だし1on1
jimpei
1
350
サービスの拡大に伴うオペレーション課題に立ち向かう / 20241128_cloudsign_pdm
bengo4com
0
770
【Oracle Cloud ウェビナー】【入門&再入門】はじめてのOracle Cloud Infrastructure [+最新情報]
oracle4engineer
PRO
2
180
エンジニアの草の根活動のその先へ LINEギフトのアクセシビリティにおける ネクストアクション
lycorptech_jp
PRO
0
110
プロダクトマネージャーは 事業責任者の夢をみるのか pmconf2024
gimupop
0
640
ゆるSRE勉強会 #8 組織的にSREが始まる中で意識したこと
abnoumaru
2
860
AWS re:Invent 2024 予選落ちのBedrockアプデをまとめて解説!
minorun365
PRO
2
240
実践/先取り「入門 Kubernetes Validating/Mutating Admission Policy」 / CloudNative Days Winter 2024
pfn
PRO
1
140
LINEヤフーにおける超大規模プラットフォーム実現への挑戦と学び / Challenges and Lessons in Building an Ultra-Large-Scale Platform at LY Corporation
hhiroshell
2
950
Entra ID の基礎(Japan Microsoft 365 コミュニティ カンファレンス 2024)
murachiakira
3
2.2k
2024/11/29_失敗談から学ぶ! エンジニア向けre:Invent攻略アンチパターン集
hiashisan
0
270
そろそろOn-Callの通知音について考えてみよう (PagerDuty編)
tk3fftk
1
290
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
760
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
Documentation Writing (for coders)
carmenintech
65
4.5k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
Practical Orchestrator
shlominoach
186
10k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
The Invisible Side of Design
smashingmag
298
50k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
27
2.1k
Transcript
ハッシュと暗号は違うぞ! PHPカンファレンス関西 2017 2017/07/15(土)13:10〜 長谷川智希 HASEGAWA Tomoki
長谷川 智希 デジタルサーカス株式会社 副団長CTO Digital Circus, Inc. Vice-master CTO Tokyo,
Japan @tomzoh
ライフワーク: 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
None
None
WE ARE HIRING!! Web Development with http://www.dgcircus.com Omotesando, Tokyo
今日のテーマ ハッシュと暗号は違うぞ! Today’s theme
• 実際にあったやりとり:
• 実際にあったやりとり: お客さま「セキュリティ上DBにパスワードを保存しないで。」
• 実際にあったやりとり: お客さま「セキュリティ上DBにパスワードを保存しないで。」 ベンダ「ではパスワードは暗号化して保存しましょう。」
• 実際にあったやりとり: お客さま「セキュリティ上DBにパスワードを保存しないで。」 ベンダ「ではパスワードは暗号化して保存しましょう。」 ぼく「まって!!!! 」
• 実際にあったやりとり: • 本当にそこは暗号化?ハッシュじゃなくて? お客さま「セキュリティ上DBにパスワードを保存しないで。」 ベンダ「ではパスワードは暗号化して保存しましょう。」 ぼく「まって!!!! 」
• 実際にあったやりとり: • 本当にそこは暗号化?ハッシュじゃなくて? お客さま「セキュリティ上DBにパスワードを保存しないで。」 ベンダ「ではパスワードは暗号化して保存しましょう。」 ぼく「まって!!!! 」 • 「ハッシュと暗号化は違うぞ!」
None
None
今日のテーマ ハッシュと暗号は違うぞ! Today’s theme
ハッシュとは何か
ハッシュ
ハッシュ ハッシュ関数 ハッシュ値
ハッシュ関数 • 関数:
ハッシュ関数 • 関数: sin(θ), cos(θ), f(x)
ハッシュ関数 • 関数: sin(θ), cos(θ), f(x) • ハッシュ関数
ハッシュ関数 • 関数: sin(θ), cos(θ), f(x) • データをハッシュ関数に入力するとハッシュ値 が出力される。 •
ハッシュ関数
ハッシュ関数 • 関数: sin(θ), cos(θ), f(x) • データをハッシュ関数に入力するとハッシュ値 が出力される。 •
ハッシュ関数の例: • ハッシュ関数
ハッシュ関数 • 関数: sin(θ), cos(θ), f(x) md5, sha-1, sha-512 •
データをハッシュ関数に入力するとハッシュ値 が出力される。 • ハッシュ関数の例: • ハッシュ関数
• データをハッシュ関数に入力するとハッシュ値 が出力される。
• データをハッシュ関数に入力するとハッシュ値 が出力される。 sha1
• データをハッシュ関数に入力するとハッシュ値 が出力される。 PHPカンファレンス関西 sha1
• データをハッシュ関数に入力するとハッシュ値 が出力される。 e35257f41406f46cf884ac9c6af27707bf5c5d05 PHPカンファレンス関西 sha1
ハッシュ関数の特徴
ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない
任意長のデータから 固定長のハッシュ値を出力する
任意長のデータから固定長のハッシュ値を出力する sha1
任意長のデータから固定長のハッシュ値を出力する PHPカンファレンス関西 sha1
任意長のデータから固定長のハッシュ値を出力する e35257f41406f46cf884ac9c6af27707bf5c5d05 PHPカンファレンス関西 sha1
任意長のデータから固定長のハッシュ値を出力する e35257f41406f46cf884ac9c6af27707bf5c5d05 PHPカンファレンス関西 sha1 31bytes
任意長のデータから固定長のハッシュ値を出力する e35257f41406f46cf884ac9c6af27707bf5c5d05 PHPカンファレンス関西 sha1 31bytes 160bits
吾輩は猫である…ありがたいありがたい。 sha1 任意長のデータから固定長のハッシュ値を出力する
吾輩は猫である…ありがたいありがたい。 sha1 275kbytes 任意長のデータから固定長のハッシュ値を出力する
beb2bc58c7cac6510ce0638a4e8ae3f05e51b60c 吾輩は猫である…ありがたいありがたい。 sha1 275kbytes 任意長のデータから固定長のハッシュ値を出力する
beb2bc58c7cac6510ce0638a4e8ae3f05e51b60c 吾輩は猫である…ありがたいありがたい。 sha1 275kbytes 160bits 任意長のデータから固定長のハッシュ値を出力する
同じデータからは 同じハッシュ値を出力する
同じデータからは同じハッシュ値を出力する sha1
同じデータからは同じハッシュ値を出力する sha1 86f7…67b8 データ1
同じデータからは同じハッシュ値を出力する sha1 86f7…67b8 86f7…67b8 データ1 データ1
同じデータからは同じハッシュ値を出力する sha1 86f7…67b8 86f7…67b8 86f7…67b8 データ1 データ1 データ1
別のデータからは だいたい別のハッシュ値を出力する
別のデータからはだいたい別のハッシュ値を出力する sha1
別のデータからはだいたい別のハッシュ値を出力する sha1 86f7…67b8 データ1
別のデータからはだいたい別のハッシュ値を出力する sha1 86f7…67b8 e9d71…8f98 データ1 データ2
別のデータからはだいたい別のハッシュ値を出力する sha1 86f7…67b8 e9d71…8f98 84a5…dbb4 データ1 データ2 データ3
ハッシュ値から 元のデータを算出することはほぼ出来ない
ハッシュ値から元のデータを算出することはほぼ出来ない sha1
ハッシュ値から元のデータを算出することはほぼ出来ない sha1 データ1
ハッシュ値から元のデータを算出することはほぼ出来ない sha1 データ1 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
ハッシュ値から元のデータを算出することはほぼ出来ない sha1 データ1 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 データ1
ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない
ハッシュ関数の利用
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 Web Site
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 配布ファイル Web Site
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 配布ファイル 86f7…67b8 sha1 Web Site 配布ファイルから
ハッシュ値を計算
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 配布ファイル 86f7…67b8 sha1 Web Site 86f7…67b8
配布ファイルとsha1を Webにアップ
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 配布ファイル 86f7…67b8 sha1 Web Site 86f7…67b8
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 配布ファイル 86f7…67b8 sha1 Web Site 86f7…67b8
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 配布ファイル 86f7…67b8 sha1 Web Site 86f7…67b8
配布ファイルを ダウンロード
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 配布ファイル 86f7…67b8 sha1 Web Site 86f7…67b8
86f7…67b8 sha1 ダウンロードした ファイルから ハッシュ値を計算
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 配布ファイル 86f7…67b8 sha1 Web Site 86f7…67b8
86f7…67b8 sha1 ハッシュ値を比較
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 配布ファイル 86f7…67b8 sha1 Web Site 86f7…67b8
86f7…67b8 sha1 ハッシュ値を比較 「ハッシュ値が同一」 → 「ちゃんとダウンロードできた」
UbuntuのISO配布サイト
UbuntuのISO配布サイト
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
推測しにくいURLの生成 「/user/1とか、IDがURLに丸見えなの、カッコ 悪いな…」 id username … 1 bob …
2 jones … : : : … https://example.com/user/1
推測しにくいURLの生成 「/user/1とか、IDがURLに丸見えなの、カッコ 悪いな…」 id username hash … 1 bob
4818…920a … 2 jones 4c46…3902 … : : : … https://example.com/user/4c46bc790ffe655a1e65acfacf95da50cd4d3902
ログインパスワードの保存 よくあるログインのフローはこんな: • ユーザはユーザ名とパスワードを入力 • システムはDBからユーザ名でレコードを探す • 見つけたレコードのパスワードと 入力されたパスワードが一致すればログインOK!
username password bob ••• Login
id username password … 1 bob M2teM2P0 … 2
jones tqigg75Y … : : : … username password bob ••• Login
id username password … 1 bob M2teM2P0 … 2
jones tqigg75Y … : : : … username password bob ••• Login
id username password … 1 bob M2teM2P0 … 2
jones tqigg75Y … : : : … username password bob ••• Login
id username password … 1 bob M2teM2P0 … 2
jones tqigg75Y … : : : … username password bob ••• Login 入力されたパスワードと DBのパスワードを比較
id username password … 1 bob M2teM2P0 … 2
jones tqigg75Y … : : : … username password bob ••• Login 入力されたパスワードと DBのパスワードを比較 入力されたパスワードとDBのパス ワードが一致 → ログイン成功
「パスワードをDBにそのまま保存するの 怖いなあ…」 id username password … 1 bob M2teM2P0
… 2 jones tqigg75Y … : : : …
「パスワードをDBにそのまま保存するの 怖いなあ…」 「ユーザ登録時にユーザが設定した文字列と、 ログイン時にユーザが入力した文字列が 同じものだと判断できればいいんだよね。」
「パスワードそのものじゃなくて、 パスワードのハッシュ値を保存しておこう!」
id username hashed_password … 1 bob 3c65…1d8b … 2
jones d578…fa1f … : : : … 「パスワードそのものじゃなくて、 パスワードのハッシュ値を保存しておこう!」 パスワードのハッシュ値
username password bob ••• Signup
username password bob ••• Signup 入力されたパスワードを ハッシュ化 3c65…1d8b sha1
id username hashed_password … 1 bob 3c65…1d8b … 2
jones d578…fa1f … : : : … username password bob ••• Signup 3c65…1d8b sha1 DBにはハッシュ化されたパスワードを保存
id username hashed_password … 1 bob 3c65…1d8b … 2
jones d578…fa1f … : : : … username password bob ••• Login
id username hashed_password … 1 bob 3c65…1d8b … 2
jones d578…fa1f … : : : … username password bob ••• Login
id username hashed_password … 1 bob 3c65…1d8b … 2
jones d578…fa1f … : : : … username password bob ••• Login
id username hashed_password … 1 bob 3c65…1d8b … 2
jones d578…fa1f … : : : … username password bob ••• Login 入力されたパスワードを ハッシュ化 3c65…1d8b sha1
id username hashed_password … 1 bob 3c65…1d8b … 2
jones d578…fa1f … : : : … username password bob ••• Login 3c65…1d8b sha1 入力されたパスワードを ハッシュ化したものと DBに保存されたものを比較
id username hashed_password … 1 bob 3c65…1d8b … 2
jones d578…fa1f … : : : … username password bob ••• Login 入力されたパスワードをハッシュ化したものと DBに保存されたハッシュ化したパスワードが一致 → ログイン成功 3c65…1d8b sha1 入力されたパスワードを ハッシュ化したものと DBに保存されたものを比較
DBにパスワードそのものが 保存されている必要は無い
ログイン処理に パスワードそのものが必要な訳でも無い
ハッシュ化された パスワードがあれば良い。 (もとに戻せなくても)
ハッシュ、便利ですね!
ハッシュ値の衝突
ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない
ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない
元データ 32bit data 1 data 2 data 3 data 4
data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer
元データ 32bit data 1 data 2 data 3 data 4
data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する
元データ 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の ハッシュ値を出力する
元データ 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の ハッシュ値を出力する
元データ 32bit data 1 data 2 data 3 data 4
data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する
元データ 32bit data 1 data 2 data 3 data 4
data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する
元データ 32bit data 1 data 2 data 3 data 4
data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する
元データ 32bit data 1 data 2 data 3 data 4
data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する
元データ 32bit data 1 data 2 data 3 data 4
data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する
元データ 32bit data 1 data 2 data 3 data 4
data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 任意長のデータから2bitの ハッシュ値を出力する
元データ 32bit data 1 data 2 data 3 data 4
data 5 ハッシュ値 2bit hash 1 hash 2 hash 3 hash 4 sha-beer 衝突! 任意長のデータから2bitの ハッシュ値を出力する
ハッシュ値の衝突 • ハッシュ値は必ず衝突する
ハッシュ値の衝突 • ハッシュ値は必ず衝突する • ハッシュを使う場合は衝突したら困るか困らないかを 必ず考える。
ハッシュ値の衝突 • ハッシュ値は必ず衝突する • ハッシュを使う場合は衝突したら困るか困らないかを 必ず考える。 • 推測しにくいURLの生成の例:
ハッシュ値の衝突 • ハッシュ値は必ず衝突する • ハッシュを使う場合は衝突したら困るか困らないかを 必ず考える。 • 推測しにくいURLの生成の例: 衝突したら困る
ハッシュ値の衝突 • ハッシュ値は必ず衝突する • ハッシュを使う場合は衝突したら困るか困らないかを 必ず考える。 • 推測しにくいURLの生成の例: 衝突したら困る •
ログインパスワードの保存:
ハッシュ値の衝突 • ハッシュ値は必ず衝突する • ハッシュを使う場合は衝突したら困るか困らないかを 必ず考える。 • 推測しにくいURLの生成の例: 衝突したら困る •
ログインパスワードの保存: 衝突しても困らない
「ハッシュ値の衝突」による攻撃
ファイルの同一性チェック 「ダウンロードしてきたファイル、 ちゃんとダウンロードできたかな…」 86f7…67b8 sha1 Web Site 86f7…67b8
86f7…67b8 sha1 「ハッシュ値が同一」 → 「ちゃんとダウンロードできた」
ハッシュ値衝突による攻撃 神ソフトができたので公開するよ。 ハッシュ値付きね。
ハッシュ値衝突による攻撃 神ソフトができたので公開するよ。 ハッシュ値付きね。 ウィルス入れて…。末尾にゴミデータ付け加えて ハッシュ値同じにしてミラーサイトぽく配布。
ハッシュ値衝突による攻撃 ミラーサイトからダウンロードしたファイル、大丈 夫かな?…ハッシュ値合ってるしOK! 神ソフトができたので公開するよ。 ハッシュ値付きね。 ウィルス入れて…。末尾にゴミデータ付け加えて ハッシュ値同じにしてミラーサイトぽく配布。
ハッシュ値衝突による攻撃 ミラーサイトからダウンロードしたファイル、大丈 夫かな?…ハッシュ値合ってるしOK! 神ソフトができたので公開するよ。 ハッシュ値付きね。 ウィルス入れて…。末尾にゴミデータ付け加えて ハッシュ値同じにしてミラーサイトぽく配布。 ぎゃー!ウィルス入りだった!!!
ハッシュ値衝突による攻撃 ミラーサイトからダウンロードしたファイル、大丈 夫かな?…ハッシュ値合ってるしOK! 神ソフトができたので公開するよ。 ハッシュ値付きね。 ウィルス入れて…。末尾にゴミデータ付け加えて ハッシュ値同じにしてミラーサイトぽく配布。 ぎゃー!ウィルス入りだった!!! どうしたらよかった?
ハッシュ値衝突による攻撃の対策 • どうしようもない。 • ハッシュ値の衝突を意図的に起こしにくいアルゴ リズムを使うしかない。
ハッシュ値衝突による攻撃の対策 • どうしようもない。 • ハッシュ値の衝突を意図的に起こしにくいアルゴ リズムを使うしかない。
ハッシュの安全性
ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない
ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない =
衝突しにくい
ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない =
衝突しにくい = 元のデータを算出しにくい
良いハッシュ関数の特徴 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい n
良いハッシュ関数の特徴 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい 計算量:
2n 計算量: 2 n 2
23 February, 2017
SHAttered の計算量 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい
計算量: 2n
SHAttered の計算量 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい
計算量: 2n 160 2 計算量: 2 = 280
SHAttered の計算量 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい
計算量: 2n 160 2 計算量: 2 = 280
SHAttered の計算量 原像計算困難 ハッシュ値から元データを算出しにくい 第2原像計算困難 (弱衝突耐性) あるデータが与えられた時に、そのデータから算出されるハッ シュ値と同じハッシュ値を出力する別のデータを見つけにくい 衝突困難(強衝突耐性) 同じハッシュ値を出力する2つのデータを見つけにくい
計算量: 2n 計算量: 263 160 2 計算量: 2 = 280
ハッシュを使ったシステムへの攻撃
「推測しにくいURLの生成」への攻撃
推測しにくいURLの生成 「/user/1とか、IDがURLに丸見えなの、カッコ 悪いな…」 id username hash … 1 bob
4818…920a … 2 jones 4c46…3902 … : : : … https://example.com/user/4c46bc790ffe655a1e65acfacf95da50cd4d3902
原像推測による攻撃 /user/1 ってのもアレなのでハッシュ化したろ。 $url = sprintf("/user/%s", md5($userId));
原像推測による攻撃 /user/1 ってのもアレなのでハッシュ化したろ。 $url = sprintf("/user/%s", md5($userId)); この文字列の並び、md5だな。どうせ元は連番だろ。 for ($i
= 0; $i < 1000; $i++)} $page = file_get_contents( sprintf("/user/%s", md5($i)));
原像推測による攻撃 /user/1 ってのもアレなのでハッシュ化したろ。 $url = sprintf("/user/%s", md5($userId)); この文字列の並び、md5だな。どうせ元は連番だろ。 for ($i
= 0; $i < 1000; $i++)} $page = file_get_contents( sprintf("/user/%s", md5($i))); 全部バレた!
原像推測による攻撃 /user/1 ってのもアレなのでハッシュ化したろ。 $url = sprintf("/user/%s", md5($userId)); この文字列の並び、md5だな。どうせ元は連番だろ。 for ($i
= 0; $i < 1000; $i++)} $page = file_get_contents( sprintf("/user/%s", md5($i))); 全部バレた! どうしたらよかった?
原像推測による攻撃の対策 • 元データがバレない様にする。
原像推測による攻撃の対策 • 元データがバレない様にする。 • 元データが「1」とかだからバレる。
原像推測による攻撃の対策 • 元データがバレない様にする。 • 元データに長い文字列(ソルト)を追加する。 • 元データが「1」とかだからバレる。
原像推測による攻撃の対策 • 元データがバレない様にする。 • 元データに長い文字列(ソルト)を追加する。 $salt = "aemi4ahcoh7weeN2euth"; $url =
sprintf("/user/%s", md5($salt.$userId)); • 元データが「1」とかだからバレる。
原像推測による攻撃の対策 • 元データがバレない様にする。 • 元データに長い文字列(ソルト)を追加する。 $salt = "aemi4ahcoh7weeN2euth"; $url =
sprintf("/user/%s", md5($salt.$userId)); • 攻撃者は「aemi4ahcoh7weeN2euth1」を推測しなければならなくなる。 • 「連番とかをわかりにくくする」様な用途では、ソルトを付けない形で ハッシュ関数を使うことは無いと思って良い。 • 元データが「1」とかだからバレる。
「ログインパスワードの保存」への攻撃
ログインパスワードの保存 id username hashed_password … 1 bob 3c65…1d8b …
2 jones d578…fa1f … : : : … 「パスワードそのものじゃなくて、 パスワードのハッシュ値を保存しておこう!」 パスワードのハッシュ値
原像計算による攻撃 パスワードをハッシュ化してDBに保存したよ。 これでデータが漏洩しても大丈夫!
原像計算による攻撃 パスワードをハッシュ化してDBに保存したよ。 これでデータが漏洩しても大丈夫! この文字列の並び、md5だな。計算済みの 表を使って…。 元データ md5 abcde ab56b4d92b40713acc5af89985d4b786 qwerty
d8578edf8458ce06fbc5bb76a58c5ca4 password 5f4dcc3b5aa765d61d8327deb882cf99 : :
原像計算による攻撃 パスワードをハッシュ化してDBに保存したよ。 これでデータが漏洩しても大丈夫! あっという間にパスワードがばれた! この文字列の並び、md5だな。計算済みの 表を使って…。 元データ md5 abcde ab56b4d92b40713acc5af89985d4b786
qwerty d8578edf8458ce06fbc5bb76a58c5ca4 password 5f4dcc3b5aa765d61d8327deb882cf99 : :
原像計算による攻撃 パスワードをハッシュ化してDBに保存したよ。 これでデータが漏洩しても大丈夫! あっという間にパスワードがばれた! どうしたらよかった? この文字列の並び、md5だな。計算済みの 表を使って…。 元データ md5 abcde
ab56b4d92b40713acc5af89985d4b786 qwerty d8578edf8458ce06fbc5bb76a58c5ca4 password 5f4dcc3b5aa765d61d8327deb882cf99 : :
原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。
原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。 • そのために、元データにソルトを追加する。
原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。 • そのために、元データにソルトを追加する。 abcdeoMF0iyDQB8Bpsl6npJer9XTT7PNdCWug 607452f4c75ee977ea169e49f6c1db1c md5
原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。 • そのために、元データにソルトを追加する。 元データ md5 abcde ab56b4d92b40713acc5af89985
d4b786 abcdeoMF0iyDQB8Bpsl6npJer9XTT7PNdCWug 607452f4c75ee977ea169e49f6c1db1c md5
原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。 • そのために、元データにソルトを追加する。
原像計算による攻撃の対策 • ユーザがどんなパスワードを付けても事前に用意された テーブルにそれが現れない様にする。 • そのために、元データにソルトを追加する。 • 前のケースと同じ。 • ハッシュと聞いたらソルトは?と思うぐらいで良い。
今日のテーマ ハッシュと暗号は違うぞ! Today’s theme
ハッシュと暗号
ハッシュと暗号 ハッシュ関数によるハッシュ化 一方向 / ハッシュ値から元データに戻せないことが前提 md5, sha-1, sha-512, … n
ハッシュと暗号 ハッシュ関数によるハッシュ化 一方向 / ハッシュ値から元データに戻せないことが前提 md5, sha-1, sha-512, … 暗号化
/ 復号 双方向 / 暗号文から平文に戻せることが前提 秘密裏に通信をすることを目的とする AES, DES, RSA n
みなさんは大丈夫だと思いますが
ハッシュも暗号化も 同じ様なもんじゃない? と思ってる人は…
ハッシュでも暗号でもない でもぱっと見ハッシュに似てる概念
たぶんこれも同一視しちゃう
ハッシュと暗号と心強さと 難読化 一方向 / プログラムなどを読みにくくするための変換。 結果としてファイルサイズが小さくなるので「圧縮」って呼 んだりも。 JavaScriptやJavaでよく利用される。 n 双方向
/ エンコードされたものをデコードできることが前提。 鍵の要素が無いため、アルゴリズムを知っていれば誰でも元に 戻せる。 urlencode(), Base64, … エンコード / デコード
正しく選択しよう!
まとめ
まとめ • ハッシュ関数はデータをハッシュ値に一方向に 変換するもの。 • ハッシュ関数を使う時は必ず… • 入力データにソルトを追加する • 衝突の可能性を考慮に入れる
• 暗号化、エンコード、難読化とは違う。 • ハッシュや暗号を使う時は、なぜそれを使うか、 なぜその判断をすべきかを考えよう。
Thanks WE ARE HIRING @tomzoh プリーズ: #phpkansai / ブログ /
懇親会
時間があれば追加エピソード
プログラミング言語の「ハッシュ」 ep.1
プログラム言語の「ハッシュ」 • PHPの配列は文字列をキーに使える。 • 他の言語でも大抵この機能はある。 • 連想配列 • ハッシュ
プログラム言語の「ハッシュ」 • PHPの配列は文字列をキーに使える。 • 他の言語でも大抵この機能はある。 • 連想配列 • ハッシュ
プログラム言語の「ハッシュ」 • PHPの配列は文字列をキーに使える。 • 他の言語でも大抵この機能はある。 • 連想配列 • ハッシュ
何故「ハッシュ」?
連想配列の実装
$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ
$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200
0x1300 nagatomo:yuto
$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200
0x1300 nagatomo:yuto
$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200
0x1300 nagatomo:yuto kagawa:shinji
$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200
0x1300 nagatomo:yuto kagawa:shinji
$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200
0x1300 nagatomo:yuto kagawa:shinji
$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200
0x1300 nagatomo:yuto sha-beer kagawa:shinji
$array[‘kagawa’] = ‘shinji’; 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100
0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji
$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji
$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji
$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji
$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji
$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ 0x02 アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto sha-beer kagawa:shinji 0x1200
$array[‘kagawa’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200
echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03
0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200
echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03
0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200
echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03
0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 sha-beer
echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03
0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer
echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03
0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer
echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03
0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer
echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03
0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer
echo $array[‘kagawa’]; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02 0x03
0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 0x1300 nagatomo:yuto kagawa:shinji 0x1200 0x02 sha-beer
O(1)
あれ、衝突は?
もちろんあります
$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200
$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200
$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200 okazaki:shinji
$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200 okazaki:shinji
$array[‘okazaki’] = ‘shinji’; インデックス アドレス 0x00 0x1100 0x01 0x1000 0x02
0x03 0x1300 連想配列とハッシュ アドレス データ 0x1000 honda:keisuke 0x1100 0x1200 kagawa:shinji 0x1300 nagatomo:yuto 0x1200 okazaki:shinji
$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
$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
$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
$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 衝突!
hashdos ep.2
hashdos • PHPやRubyなどWebアプリで使用する言語では、 GETやPOSTのパラメタ、Cookieを連想配列に格納 してWebアプリに引き渡す。 kagawa shinji Submit
hashdos • PHPやRubyなどWebアプリで使用する言語では、 GETやPOSTのパラメタ、Cookieを連想配列に格納 してWebアプリに引き渡す。 kagawa shinji Submit $_POST =
[ ‘familyName’ => ’kagawa’, ‘firstName’ => ’shinji’, ];
hashdos • GETやPOSTのパラメタ名、Cookie名が連想配列の キーになる。 • GETやPOSTのパラメタ名、Cookie名はブラウザ側 から任意に指定可能。
hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’
]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’,
hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’
]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’,
hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’
]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’, 外部から任意に作成可能
hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’
]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’, 外部から任意に作成可能 すべてのキーを 衝突させると? ?
hashes $_POST = [ ‘okazaki’ ‘kiyotake’ ‘kagawa’ ‘honda’ : ‘eiji’
]; => ‘shinji’, => ‘hiroshi’, => ‘shinji’, => ‘keisuke’, => ‘kawashima’, 外部から任意に作成可能 すべてのキーを 衝突させると? ? 著しくパフォー マンスが低下する
demo http://koto.github.io/blog-kotowicz-net-examples/hashcollision/kill.html
原像計算攻撃 ep.3
ハッシュ関数の特徴 1. 任意長のデータから固定長のハッシュ値を出力する 2. 同じデータからは同じハッシュ値を出力する 3. 別のデータからはだいたい別のハッシュ値を出力する 4. ハッシュ値から元のデータを算出することはほぼ出来ない
23 February, 2017
sha1が破られる is 一大事
sha1が破られる is 一大事 ただし一定の条件下で
None
None
本当?
ハッシュ値の原像計算 • ハッシュ値の原像計算の原則は総当たり • 160ビットのハッシュ値の原像計算の計算量は 2^160。 • 元データのパターンが少なかったら? • 携帯の番号って
0[5, 7, 9]0-[0-9]{8} ぐらいし か無い。(010もあったっけ?) • 3億通り
<?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; } } }
原像計算攻撃は総当たりベース
ハッシュ化されたパスワードが 流出しても比較的大丈夫なのは パスワードは文字数や文字種の バリエーションが多いから。
巨人の肩に乗る ep.4
「パスワードのハッシュ化」とか 難しいところはたいてい 頭いい人が考えて仕組みを 作ってくれている
巨人の肩に乗ろう
ただし
中身を理解せずに なんとなく使うのは最悪
意味が無いだけなら良いが、 せっかく考えられた仕組みを 殺すことにもなり得る
例えば…
None
None
None
自分は何をしたいのか 「巨人」は何を与えてくれているのか ちゃんと理解して、正しく使おう
そして…
この手の 「特定の製品に依存しない知識」は エンジニアの血となり肉となり、 エンジニアとして生きていくための 力になる
「力が…欲しいか…」
こういう知識をどうやって得るか • ハッシュに限らず、ソフトウェア開発には多くの 周辺知識が必要。 • 情報系の大学や専門学校では教わる(はず)。 • 体系的に広く学ぶのであれば資格試験が便利。 • IPA(情報処理推進機構)の
「情報処理技術者試験」がおすすめ。 http://www.jitec.ipa.go.jp
共通鍵暗号と公開鍵暗号 ep.5
共通鍵方式暗号 信頼できない 通信路 信頼できる 通信路
共通鍵方式暗号 信頼できない 通信路 信頼できる 通信路 鍵を事前に共有
共通鍵方式暗号 ƪ 信頼できない 通信路 鍵を使って暗号化 信頼できる 通信路 鍵を事前に共有
共通鍵方式暗号 ƪ ƪ 信頼できない 通信路 鍵を使って暗号化 信頼できる 通信路
鍵を事前に共有
共通鍵方式暗号 ƪ ƪ 信頼できない 通信路 鍵を使って暗号化 暗号化に使ったのと 同じ鍵を使って復号
信頼できる 通信路 鍵を事前に共有
公開鍵方式暗号 信頼できない 通信路
公開鍵方式暗号 信頼できない 通信路 公開鍵を事前に共有
公開鍵方式暗号 ƪ 信頼できない 通信路 相手の公開鍵を 使って暗号化 公開鍵を事前に共有
公開鍵方式暗号 ƪ ƪ 信頼できない 通信路 相手の公開鍵を 使って暗号化 自分の秘密鍵を
使って復号 公開鍵を事前に共有
小ネタ集 ep.6
妥当なソルト • ソルトとして妥当な文字列は何か • 長さが一定以上あることだけど… • 長いソルトはハッシュ関数に入力するデータの情報量を増や す。 • 情報量が増えると衝突を起こしやすくなるかもしれない。
• 一般的に使用されるハッシュ関数はこの様な「近いデータ (ソルトが同じで元データ部分だけが違うデータ)」が衝突 しにくい様に設計されている。 • 20文字程度、とか、26文字程度、とかいろいろ言われてい る。
encrypt / decrypt • 暗号化と復号 • 暗号化 encrypt • 復号
decrypt • 日本語では「暗号」は名詞「復号」は動詞。 • なので「暗号化」として動詞化する。 • 英語は「encrypt」も「decrypt」も動詞。 • シンプルでうらやましいね!
ハッシュテーブル • あらかじめ全ての文字列に対するハッシュ値を計算して おき、そこから検索する方法で高速に原像計算が可能。 元データ md5 aaaa 74b87337454200d4d33f80c4663dc5e5 aaab 4c189b020ceb022e0ecc42482802e2b8
aaac 3963a2ba65ac8eb1c6e2140460031925 : :
ハッシュテーブル • あらかじめ全ての文字列に対するハッシュ値を計算して おき、そこから検索する方法で高速に原像計算が可能。 • このテーブル、すごくデカい。 • 4文字で640MB、5文字で50GB、8文字で12PB。 • テーブルを小さくするためにレインボーテーブルという
方法がある。 元データ md5 aaaa 74b87337454200d4d33f80c4663dc5e5 aaab 4c189b020ceb022e0ecc42482802e2b8 aaac 3963a2ba65ac8eb1c6e2140460031925 : :
Thanks WE ARE HIRING @tomzoh プリーズ: #phpkansai / ブログ /
懇親会
告知
iOSDC Japan 2017 https://iosdc.jp/2017/ チケット販売中 2017.09.15(金)〜17(日)
PHPerKaigi 2018 https://phperkaigi.jp スポンサー募集…するかも 2018.03.10(土) • PHPerのためのカンファレンス • 東京都練馬区 Coconeriホールにて
• 朝から晩までテックトーク • 夕方からはビールを飲みながら • 夜はクラフトビールで懇親会
Thanks WE ARE HIRING @tomzoh プリーズ: #phpkansai / ブログ /
懇親会