Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
なぜキャッシュメモリは速いのか 余談集 / Why is Cache Memory So Fast? Extended.
tomzoh
0
110
なぜキャッシュメモリは速いのか / Why is Cache Memory So Fast?
tomzoh
2
1.1k
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
450
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
460
コンピュータはなぜ0と1なのか / How and Why Computers Operate Using Binary Code
tomzoh
0
410
PHPerKaigi 2023に行こう! / Let's Attend PHPerKaigi 2023!
tomzoh
1
280
Other Decks in Technology
See All in Technology
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
120
OCI Vault 概要
oracle4engineer
PRO
0
9.7k
いざ、BSC討伐の旅
nikinusu
2
780
Platform Engineering for Software Developers and Architects
syntasso
1
510
Amazon Personalizeのレコメンドシステム構築、実際何するの?〜大体10分で具体的なイメージをつかむ〜
kniino
1
100
【Pycon mini 東海 2024】Google Colaboratoryで試すVLM
kazuhitotakahashi
2
490
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.6k
TypeScript、上達の瞬間
sadnessojisan
46
13k
AWS Lambda のトラブルシュートをしていて思うこと
kazzpapa3
2
170
[FOSS4G 2019 Niigata] AIによる効率的危険斜面抽出システムの開発について
nssv
0
310
The Role of Developer Relations in AI Product Success.
giftojabu1
0
120
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
350
Featured
See All Featured
Writing Fast Ruby
sferik
627
61k
The Cult of Friendly URLs
andyhume
78
6k
Producing Creativity
orderedlist
PRO
341
39k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Building Adaptive Systems
keathley
38
2.3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
Documentation Writing (for coders)
carmenintech
65
4.4k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Practical Orchestrator
shlominoach
186
10k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
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 / ブログ /
懇親会