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
なぜ、パスワードハッシュのソルトはハッシュと同じ場所に置いて良いのか
Search
Akinori Takigawa
February 22, 2025
650
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
なぜ、パスワードハッシュのソルトはハッシュと同じ場所に置いて良いのか
PHPカンファレンス名古屋2025
Akinori Takigawa
February 22, 2025
More Decks by Akinori Takigawa
See All by Akinori Takigawa
Nginxになりきって、FCGIでPHPと喋ろう
akinoriakatsuka
0
86
PHPUnitのテストイベントを使ってテストにかかる時間の計測をしよう
akinoriakatsuka
0
150
パイプ演算子の実装を 覗いてみよう
akinoriakatsuka
0
230
PHPでCQRS+ES入門
akinoriakatsuka
0
230
手軽に作れる電卓を作って イベントソーシングに親しもう CQRS+ESカンファレンス2026
akinoriakatsuka
0
910
Rubyで作る物理エンジン - 叡電LT
akinoriakatsuka
0
43
パイプ演算子の実装を覗いてみよう - 【非公式】PHPカンファレンス福岡2025・前日Meetup
akinoriakatsuka
0
50
技術的負債の会計学 - PHPカンファレンス広島2025
akinoriakatsuka
8
1.6k
スクラムをちゃんとやる勇気
akinoriakatsuka
0
71
Featured
See All Featured
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
What's in a price? How to price your products and services
michaelherold
247
13k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
360
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Building Applications with DynamoDB
mza
96
7.1k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
580
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
310
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
Odyssey Design
rkendrick25
PRO
2
700
We Have a Design System, Now What?
morganepeng
55
8.2k
Transcript
ͳͥɺύεϫʔυϋογϡͷιϧτ ϋογϡͱಉ͡ॴʹஔ͍ͯྑ͍ͷ͔ 1)1ΧϯϑΝϨϯε໊ݹ QIQDPO@OBHPZB ͔͔͋ͭ
ύεϫʔυɺ ϋογϡԽ͍ͯ͠·͔͢ʁ
ιϧτ͚͍ͭͯ·͔͢ʁ
ιϧτ͕ԿͷͨΊʹ͋ͬͯɺ Ͳ͜ʹอଘ͞Ε͍ͯΔʁ
ͦΜͳٙʹ͑ΒΕΔΑ͏ʹ ͳ͍ͬͯΔͣͰ͢
͓͠ͳ͕͖ w ࣗݾհ w ϋογϡͱ w ύεϫʔυೝূͷΈʢύλʔϯʣ w ιϧτͱ w
͍͞͝ʹ w ·ͱΊ
͔͔͋ͭ w ௩ܒلʢ͔͔͖͋ͭ͋ͷΓʣ w 1)1FS!ਆށ w 1)1ΧϯϑΝϨϯε࣮ؔߦҕһ 𝕏 BLJ@BSUJTBO
1)1ΧϯϑΝϨϯεؔ 🎉ୈճ🎉 ⚓ॳͷਆށ։࠵🚢 𝕏 QIQ@LBOTBJ
1)1ΧϯϑΝϨϯεؔ 𝕏 QIQ@LBOTBJ PHPカンファレンス名古屋をお楽しみのみなさん! 今すぐ宿取ろう!
ϋογϡͱԿ͔
ϋογϡؔͱ ) 1)1ΧϯϑΝϨϯε໊ݹ bb331ec7eb4e43ceb1e32b 0ef65cf56e5fcf7ce1 ϋογϡ
ϋογϡؔͱ ) BBBC f1abd73aa0858634f18d36 bf5666194958a8b7d2 ) BBBB 70c881d4a26984ddce795f 6f71817c9cf4480e79 )
BBBD 00b25f15212ed225d3389b 5f75369c82084b3a76 গ͠Ͱҧ͏σʔλΛೖྗ͢Δͱ͔ͳΓҧ͏ϋογϡ͕ग़ྗ͞ΕΔ
ϋογϡؔͱ ) QBTTXPSE 5baa61e4c9b93f3f068225 0b6cf8331b7ee68fd8 ) QBTTXPSE 5baa61e4c9b93f3f068225 0b6cf8331b7ee68fd8 )
QBTTXPSE 5baa61e4c9b93f3f068225 0b6cf8331b7ee68fd8 ಉ͡σʔλΛೖྗ͢Δͱಉ͡ϋογϡ͕ग़ྗ͞ΕΔ
҉߸ֶతϋογϡؔ CCFDFCFDFCF CFGDGFGDGDF m1 m2 H(m1) = H(m2)
ύεϫʔυೝূͷΈ
ύεϫʔυೝূͷΈʢ❌ϋογϡԽͳ͠ʣ JE FNBJM QBTTXPSE BBB!FYBNQMFDPN IMZQF BBC!FYBNQMFDPN ODCPLMC
BBD!FYBNQMFDPN LQNWQP 6TFS BBD!FYBNQMFDPN ϝʔϧΞυϨε ύεϫʔυ ৽نొ LQNWQP
BBD!FYBNQMFDPN ϝʔϧΞυϨε ύεϫʔυ ϩάΠϯ ύεϫʔυೝূͷΈʢ❌ϋογϡԽͳ͠ʣ JE FNBJM QBTTXPSE BBB!FYBNQMFDPN
IMZQF BBC!FYBNQMFDPN ODCPLMC BBD!FYBNQMFDPN LQNWQP 6TFS LQNWQP LQNWQP ൺֱ
ͳͥύεϫʔυΛϋογϡԽ͢Δඞཁ͕͋Δͷ͔ w %#͕ྲྀग़ͨ࣌͠ʹଈ࠲ʹѱ༻͞Εͳ͍Α͏ʹ͢Δ w ύεϫʔυϦετ߈ܸͰଞαʔϏεʹӨڹͯ͠͠·͏߹͋Δ w %#͕ྲྀग़͢Δͷ͋Γಘͳ͍ͱࢥ͏͔͠Εͳ͍͕ɺաڈʹ࿙Ӯࣄ݅ى͖ ͍ͯΔ w ;͍͊Δศ<>
w ສ݅ͷฏจύεϫʔυ͕ྲྀग़ˠͦͷޙαʔϏεऴྃ w స͵ઌͷ伺ͱͯ͠ϋογϡԽඇৗʹॏཁ <>IUUQTXXXOJLLFJDPNBSUJDMF%(9.;07$"
ͦ͜Ͱϋογϡͷग़൪Ͱ͢ʂ w ϋογϡԽ͓͚ͯ͠ɺٯํͷม͕ࠔͳͷͰɺ ݩͷύεϫʔυ͕ͪʹΒΕͳ͍ w ѱ༻Λ͙͜ͱ͕Ͱ͖Δ CCFDFCFDFCF CFGDGFGDGDF
ύεϫʔυೝূͷΈʢ⚠ιϧτͳ͠ʣ JE FNBJM QBTTXPSE BBB!FYBNQMFDPN BFGF FDFCCDBBG BBC!FYBNQMFDPN
DCFB DGDFCDFBC BBD!FYBNQMFDPN GEEGBBBEDGEF ECECBFBC 6TFS BBD!FYBNQMFDPN ϝʔϧΞυϨε ύεϫʔυ ৽نొ GEEGBBBEDGEF ECECBFBC LQNWQP )
JE FNBJM QBTTXPSE BBB!FYBNQMFDPN BFGF FDFCCDBBG BBC!FYBNQMFDPN DCFB
DGDFCDFBC BBD!FYBNQMFDPN GEEGBBBEDGEF ECECBFBC 6TFS ύεϫʔυೝূͷΈʢ⚠ιϧτͳ͠ʣ GEEGBBBEDGEF ECECBFBC GEEGBBBEDGEF ECECBFBC ൺֱ BBD!FYBNQMFDPN ϝʔϧΞυϨε ύεϫʔυ ϩάΠϯ LQNWQP )
ʮϋογϡԽͷΈʯͷ w Α͘ΒΕͨγϯϓϧͳύεϫʔυ͍ύεϫʔυͩͱɺ͙͢ʹݩͷΛݟ ͚ͭΒΕͯ͠·͏ w ྫ͑ɺ࿙Εͨϋογϡ͕NE RXFSUZ ͷ݁ՌͱϚον͢Εɺύεϫ ʔυ͕RXFSUZͩͱΘ͔ΒΕͯ͠·͏ʢࣙॻ߈ܸʣ w
NETIBͳͲͷ༗໊ͳϋογϡؔͰɺϨΠϯϘʔςʔϒϧΛͬͯ ݩͷύεϫʔυΛݟ͚ͭΒΕͯ͠·͏
ιϧτͱ
ιϧτͱ w ϋογϡͷݩσʔλʹՃ͢Δจࣈྻ w 1)1ͰQBTTXPSE@IBTI Λ͏͜ͱͰϥϯμϜͳιϧτΛ͚ͭͯ͘ΕΔ w ࠓ৮Εͳ͍͕ɺQBTTXPSE@IBTIQBTTXPSE@WFSJGZͱΈ߹ΘͤΔ͜ ͱͰɺλΠϛϯά߈ܸʹରͯ͠༗ޮͳͷͰɺΑ΄Ͳͷࣄ͕ͳ͍ݶΓ͜Ε Λ͏ͷ͕͓͢͢Ί
ύεϫʔυೝূͷྲྀΕʢ✅QBTTXPSE@IBTIʣ BBD!FYBNQMFDPN ϝʔϧΞυϨε ύεϫʔυ ৽نొ JE FNBJM QBTTXPSE BBB!FYBNQMFDPN
$2y$10$..De BBC!FYBNQMFDPN $2y$10$..Sa BBD!FYBNQMFDPN $2y$10$..VO 6TFS IBTIQBTTXPSE@IBTI QBTTXPSE 1"44803%@%&'"6-5 ZL%F268#7Q+QY7RU4RZFUV61Y+BQ$"QJ-CN7 O$0.W.;9I70
ύεϫʔυೝূͷྲྀΕʢ✅QBTTXPSE@IBTIʣ BBD!FYBNQMFDPN ϝʔϧΞυϨε ύεϫʔυ ৽نొ JE FNBJM QBTTXPSE BBB!FYBNQMFDPN
$2y$10$..De BBC!FYBNQMFDPN $2y$10$..Sa BBD!FYBNQMFDPN $2y$10$..VO 6TFS IBTIQBTTXPSE@IBTI QBTTXPSE 1"44803%@%&'"6-5 ZL%F268#7Q+QY7RU4RZFUV61Y+BQ$"QJ-CN7 O$0.W.;9I70 ZL%F268#7Q+QY7RU4RZFUV61Y+BQ$"QJ-CN7O$0.W.;9I70 ΞϧΰϦζϜ Φϓγϣϯ ιϧτ ϋογϡԽ͞Εͨύεϫʔυ ·ͱΊͯ%#ʹొ͢Δʢಉ͡ͱ͜Ζʹஔ͘ʣ
JE FNBJM QBTTXPSE BBB!FYBNQMFDPN $2y$10$..De BBC!FYBNQMFDPN $2y$10$..Sa
BBD!FYBNQMFDPN $2y$10$..VO 6TFS ύεϫʔυೝূͷྲྀΕʢ✅QBTTXPSE@IBTIʣ BBD!FYBNQMFDPN ϝʔϧΞυϨε ύεϫʔυ ϩάΠϯ QBTTXPSE@WFSJGZ QBTTXPSE Z70 USVFͩͬͨΒɺೝূޭ
QBTTXPSE@IBTI QBTTXPSE@IBTI QBTTXPSE 1"44803%@#$3:15 $2y$10$.kDeQU9WBVpJpxVqtS4qyetuUPxJapCApiLbmVnCO6MvMZ6X14hVO w ZΞϧΰϦζϜ͕CDSZQU w ίετ͕
ճϋογϡԽ͢Δ w ιϧτL%F268#7Q+QY7RU4RZF ຖճҧ͏݁Ռ͕ग़Δͷɺιϧτ͕ϥϯμϜ͔ͩΒ ιϧτͱΦϓγϣϯ͕ಉ͡ͳΒಉ͡ϋογϡ͕ಘΒΕΔ
QBTTXPSE@WFSJGZ IBTIQBTTXPSE@IBTI QBTTXPSE 1"44803%@#$3:15 $2y$10$.kDeQU9WBVpJpxVqtS4qyetuUPxJapCApiLbmVnCO6MvMZ6X14hVO SFTVMUQBTTXPSE@WFSJGZ QBTTXPSE
IBTI IBTIʹιϧτؚ͕·Ε͍ͯΔͷͰɺ QBTTXPSEʹ͍ͭͯಉ͡ιϧτͰϋογϡΛܭࢉ͢Δ͜ͱͰݕূ͕Մೳ
ιϧτΛ͚ͭΔ͜ͱͷޮՌ w ιϧτΛ͚ͭΔ͜ͱͰϨΠϯϘʔςʔϒϧʹΑΔ߈ܸ͕ࠔʹͳΔ w ιϧτΛՃͨ͠ύεϫʔυʹର͢ΔϋογϡΛ͋Β͔͡Ί͓࣋ͬͯ͘ඞཁ ͕͋Δ w ͍ϝοηʔδʹର͢ΔϨΠϯϘʔςʔϒϧPSιϧτͷछྨͷϨΠϯϘʔ ςʔϒϧΛ༻ҙ͢Δඞཁ͕͋Γɺݱ࣮తͰͳ͍
ͳͥɺϋογϡͱಉ͡ॴʹஔ͍ͯྑ͍ͷ͔ w ϥϯμϜͳιϧτΛ͚ͭͯੜͨ͠ϋογϡʹରͯ͠ݩͷϝοηʔδΛಘΔͨ ΊʹɺιϧτͷςʔϒϧΛ༻ҙ͢Δඞཁ͕͋Δ w ιϧτ͕ϥϯμϜͰ͋ΔҎ্ɺܾΊ͏ͪͰςʔϒϧΛ࡞ΔΘ͚ʹ͍͔ͳ͍ w ߈ܸऀʹιϧτ͕͔ͬͨͱͯ͠ݩͷϝοηʔδΛݟ͚ͭΔͷ͕ࠔͳͷ Ͱɺผͷͱ͜Ζʹஔ͘ඞཁ͕ͳ͍ w
Ή͠ΖศརͳͷͰɺಉ͡ͱ͜Ζʹஔ͘͜ͱ͕ਪ͞Ε͍ͯΔ<> <>IUUQTXXXQIQOFUNBOVBMKBGBRQBTTXPSETQIQGBRQBTTXPSETUPSJOHTBMUT
ଞͷݴޠͱͷޓੑ w ZͷܗࣜͷύεϫʔυϋογϡଞͷݴޠͰ͑Δ͜ͱ͕͋Δ w ͜ͷܗࣜΛ͍ͬͯΕɺݴޠؒͷΓ͑ͷ࣌ʹʹͳΓʹ͍͘ w ྫ͑HPMBOHͷCDSZQU(FOFSBUF'SPN1BTTXPSE w IUUQTHPEFWQMBZQCI7+ w
IUUQTHPEFWQMBZQLKI)R)K0%4R w QBTTXPSE@IBTI Λ͓͏ʂʢେࣄͳ͜ͱͳͷͰճʣ
͍͞͝ʹ w ηΩϡϦςΟରࡦΛߟ͑Δ࣌ʹɺʮԿ͔ΒकΔͨΊʹԿΛ͢Δͷ͔ʯΛ ͓ͬͯ͘͜ͱ͕େ w ෆਖ਼ΞΫηεˠϋογϡԽ w ݪ૾߈ܸˠιϧτͱετϨονϯά w ରࡦͷதΛ͓͚ͬͯɺͦͷରࡦͷݶքΘ͔Δ
w ύεϫʔυΛϋογϡԽͯ͠ɺฏจύεϫʔυ͕ผͷܦ࿏ʢྫ͑ϑΟο γϯάʣͰ࿙ΕͨΒෆਖ਼ϩάΠϯΛڐͯ͠͠·͏ʂ
·ͱΊ
·ͱΊ w ύεϫʔυΛฏจͰอଘ͢Δͷةݥ w ϋογϡԽ͢Δ͚ͩͰϨΠϯϘʔςʔϒϧͰύεϫʔυΛݟ͚ͭΒΕͯ͠· ͏Մೳੑ͕͋Δ w 1)1ͰύεϫʔυೝূΛ͢Δ߹ɺQBTTXPSE@IBTIͱQBTTXPSE@WFSJGZΛ ༻͍Δͷ͕Α͍ w
ηΩϡϦςΟରࡦΛߟ͑Δ࣌ʹɺͲΜͳ߈ܸ͕͋ͬͯɺͳͥͦͷରࡦ͕ޮ͘ ͷ͔͓ͬͯ͘͜ͱ͕େ
தΛͬͯɺ ҆શͳ։ൃϥΠϑΛʂ
͓͢͢Ίࢿྉ w 1)1ύεϫʔυͷϋογϡ.BOVBM w ϋογϡͱ҉߸ҧ͏ͧʂ1)1ΧϯϑΝϨϯεؔ)BTIPS &ODSZQUJPO w ମܥతʹֶͿ҆શͳ8FCΞϓϦέʔγϣϯͷ࡞Γํୈ൛੬ऑੑ͕ੜ·Ε Δݪཧͱରࡦͷ࣮ફ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ ϕετεϐʔΧʔථΑΖ͓͘͠ئ͍͠·͢🥺
͕࣌ؒ͋Ε༨ஊू
QBTTXPSE@IBTIͷσϑΥϧτΦϓγϣϯ w 1)1͔ΒɺίετͷσϑΥϧτ͕͔ΒʹมΘ͍ͬͯͨ w υΩϡϝϯτ͕ͷ··ͩͬͨͷͰ֬ೝ͢Δͱʜ
DSZQUʢιϧτΛࢦఆͯ͠ϋογϡΛܭࢉʣ $2y$10$.kDeQU9WBVpJpxVqtS4qyetuUPxJapCApiLbmVnCO6MvMZ6X14hVO DSZQU ZL%F268#7Q+QY7RU4RZF QBTTXPSE $2y$10$.kDeQU9WBVpJpxVqtS4qyetuUPxJapCApiLbmVnCO6MvMZ6X14hVO
DSZQUʢιϧτΛࢦఆͯ͠ϋογϡΛܭࢉʣ $2y$10$.kDeQU9WBVpJpxVqtS4qyetuUPxJapCApiLbmVnCO6MvMZ6X14hVO DSZQU ZL%F268#7Q+QY7RU4RZF QBTTXPSE $2y$10$.kDeQU9WBVpJpxVqtS4qyetuUPxJapCApiLbmVnCO6MvMZ6X14hVO Ұக ιϧτͱΦϓγϣϯ͕ಉ͡ͳΒಉ͡ϋογϡ͕ੜ͞ΕΔ͜ͱ͕֬ೝͰ͖ͨ
DSZQUΛͬͯϋογϡΛ࠶ݱ͢Δ %&.0͋Γ <?php $password = 'password'; $password_hash = password_hash($password, PASSWORD_DEFAULT);
$algo = substr($password_hash, 0, 7); // $2y$10$ $salt = substr($password_hash, 7, 22); $hash = substr($password_hash, 29); var_dump($password_hash, $algo, $salt, $hash); // password_verifyΛΘͣʹݕূͯ͠ΈΔ $password_hash_by_crypt = crypt($password, $algo . $salt); var_dump($password_hash, $password_hash_by_crypt); var_dump(hash_equals($password_hash, $password_hash_by_crypt));
1"44803%@%&'"6-5ͷਖ਼ମ w WBS@EVNQ 1"44803%@%&'"6-5 w TUSJOH Z w
ZͷZ w ࣮Z1)1ʹ͔͠ͳ͍ w ͕CMPX fi TIΞϧΰϦζϜͰB C Y Zͷόʔδϣϯ͕͋Δ w YͱZ1)1ͷࣄʹΑͬͯՃ͞Εͨόʔδϣϯ w ଞݴޠͰݕূ͚ͩରԠ͍ͯ͠Δ߹͋Δ HPMBOHͷ#DSZQU