Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
なぜ、パスワードハッシュのソルトはハッシュと同じ場所に置いて良いのか
Search
Akinori Takigawa
February 22, 2025
720
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
120
PHPUnitのテストイベントを使ってテストにかかる時間の計測をしよう
akinoriakatsuka
0
220
パイプ演算子の実装を 覗いてみよう
akinoriakatsuka
0
310
PHPでCQRS+ES入門
akinoriakatsuka
0
240
手軽に作れる電卓を作って イベントソーシングに親しもう CQRS+ESカンファレンス2026
akinoriakatsuka
0
1.1k
Rubyで作る物理エンジン - 叡電LT
akinoriakatsuka
0
53
パイプ演算子の実装を覗いてみよう - 【非公式】PHPカンファレンス福岡2025・前日Meetup
akinoriakatsuka
0
58
技術的負債の会計学 - PHPカンファレンス広島2025
akinoriakatsuka
8
1.7k
スクラムをちゃんとやる勇気
akinoriakatsuka
0
77
Featured
See All Featured
Skip the Path - Find Your Career Trail
mkilby
1
240
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
540
How to train your dragon (web standard)
notwaldorf
97
6.8k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
RailsConf 2023
tenderlove
30
1.6k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
290
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
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