Slide 1

Slide 1 text

͸ͯͳΠϯλʔϯԠื35" )BUFOB&OHJOFFS4FNJOBS

Slide 2

Slide 2 text

גࣜձࣾ͸ͯͳ νʔϑΤϯδχΞ Ճ౻ਘथ JEDPDLTDPNC

Slide 3

Slide 3 text

"OPOE"* ࠷ۙϦϦʔεͨ͠΋ͷ w ೔هͷଓ͖ΛݴޠϞσϧʢ-.ʣ ͕ॻ͍ͯ͘ΕΔαʔϏε w ΤΠϓϦϧϑʔϧʹϦϦʔε w ੜ੒͞Εͨ೔هʹ8BUFSNBSLΛ ຒΊࠐΜͰ͋Δ

Slide 4

Slide 4 text

͸ͯͳαϚʔΠϯλʔϯγοϓʹࢀՃ JEDPDLTDPNC w ౰࣌͸େֶӃੜ w ๺ւಓେֶ؀ڥՊֶӃʢ৘ใܥ͡Όͳ͍ʣ w झຯͰJ1IPOFͷΞϓϦΛ࡞ͬͯ༡ΜͰ͍ͨ w ΠϯλʔϯͰ͸ʮ͸ͯͳϒϩάʯJ04ΞϓϦΛ։ൃ

Slide 5

Slide 5 text

ݱࡏ͸ࣾһͱͯ͠೥໨ JEDPDLTDPNC w ೥൒͘Β͍ಇ͍͍ͯΔ w ͸ͯͳϒϩάɺΧΫϤϜɺΠΧϦϯάɺεϚϓϥεɺαʔϏεج൫ͳͲ w νʔϑΤϯδχΞ w ΤϯδχΞ৬ͷ·ͱΊ໾ͷͻͱΓ w Πϯλʔϯ΋؅׋

Slide 6

Slide 6 text

͸ͯͳΠϯλʔϯԠื35" )BUFOB&OHJOFFS4FNJOBS

Slide 7

Slide 7 text

Ԡืͨ͘͠ͳ͖͍ͬͯͯ·͢ ΑͶʂ

Slide 8

Slide 8 text

Πϯλʔϯγοϓ΁ͷԠื

Slide 9

Slide 9 text

Πϯλʔϯγοϓͱબߟ w ຖ೥ͨ͘͞ΜͷԠื͕͋Δ w ͋Γ͕͍ͨ w શһʹདྷͯ΋Β͑ͨΒ͍͍͕ɺͦ͏΋͍͔ͳ͍ͷͰબߟΛ͍ͯ͠Δ

Slide 10

Slide 10 text

߈ུνϟʔτ Ԡื ॻྨબߟ ໘ஊ ࠾༻

Slide 11

Slide 11 text

Ԡื

Slide 12

Slide 12 text

ԠืΫΠζ w Ԡื͢Δͱ͖ʹ؆୯ͳ՝୊Λղ͍ͯ΋Β͍ͬͯΔ

Slide 13

Slide 13 text

೥+40/4DIFNB ԠืΫΠζͷྺ࢙ w ༩͑ΒΕͨ+40/4DIFNBʹద߹ ͢Δ+40/ͰԠื { "$schema": "http: // json-schema.org/draft-04/schema#", "properties": { "accounts": { "description": "͋ͳ͕ͨར༻͍ͯ͠ΔΠϯλʔωοταʔϏεͷΞΧ΢ϯτ", "properties": { "hatena": { "description": "͸ͯͳͷΞΧ΢ϯτ໊", "type": "string" }, "github": { "description": "GitHubͷΞΧ΢ϯτ໊", "type": "string" } }, "type": "object" }, "languages": { "description": "͋ͳ͕ͨಘҙͳϓϩάϥϛϯάݴޠ(ΑΓಘҙͳݴޠॱ)", "items": { "type": "string" }, "type": "array" }, "portfolio": { "description": "MarkdownܗࣜͷࣗવจͰॻ͔Εͨ͋ͳͨͷϙʔτϑΥϦΦɻଞͷ߲໨ʹऩ ·Βͳ͍಺༰΍ɺิ଍͢Δࣄ߲ͳͲΛͳΜͰ΋ॻ͍ͯԼ͍͞ɻ", "type": "string" } }, "required": ["languages", "portfolio"], "type": "object", "additionalProperties": false }

Slide 14

Slide 14 text

೥%PDLFS ԠืΫΠζͷྺ࢙

Slide 15

Slide 15 text

೥8FCΠϯεϖΫλ ԠืΫΠζͷྺ࢙

Slide 16

Slide 16 text

೥(SBQI2- ԠืΫΠζͷྺ࢙

Slide 17

Slide 17 text

ԠืΫΠζ w ͪΐͬͱखΛಈ͔ͨ͠Βղ͚Δɺ͘Β͍Λ໨ࢦ͍ͯ͠Δ w ໘ஊͰײ૝Λฉ͘ͱʮ؆୯͗ͨ͢ʯͱ΋ݴΘΕΔ w ΤϯδχΞָ͕͠ΊΔΑ͏ͳ՝୊ʹ͍ͨ͠ w ࣮૷΋޻෉͍ͯ͠Δ w ຖ೥ωλ੾Ε͍ͯ͠Δʜʜ

Slide 18

Slide 18 text

ԠืΫΠζ͸ɺ͓΋ͯͳ͠

Slide 19

Slide 19 text

ͦͯ͠ɺ೥

Slide 20

Slide 20 text

೥+BWB4DSJQU ԠืΫΠζ

Slide 21

Slide 21 text

೥+BWB4DSJQU ԠืΫΠζ

Slide 22

Slide 22 text

೥+BWB4DSJQU ԠืΫΠζ w ਖ਼͍͠ύείʔυΛҾ਺ʹͯ͠VOMPDLؔ਺Λݺͼग़͢ w +BWB4DSJQU͕࣮ࡍʹ࣮ߦ͞ΕΔ w JGSBNFΛ࢖ͬͨTBOECPYͰ࣮ߦ͍ͯ͠ΔʢͷͰBMFSUͱ͔͸Ͱ͖ͳ͍ʣ w ώϯτͷதʹGPSจ΍USZʜDBUDIͷઆ໌͕͋Δ w ͭ·Γʁ

Slide 23

Slide 23 text

೥+BWB4DSJQU ԠืΫΠζ

Slide 24

Slide 24 text

const encrypted = 's9Vo5kz2HD5y/H/I6ioBKweghEcM2zyoI9Hf74b4jxwALSgj9hk5V6dLe2LJZ/dVRXlO+FW6Kmv895UAhzN4WcDM40gYPN+PaT9hEBTwNyV2fxbe' const salt = new TextEncoder().encode(atob('MTY2LDYxLDIxOCwyMTMsMjQ5LDEwNiwyNDEsMjQzLDE3Myw2LDAsMTY0LDYxLDEyMiwyMzYsNzg=')) async function _convertPasscodeToKey(passcode) { const digest = await crypto.subtle.digest('SHA-256', (new TextEncoder()).encode(String(passcode).padStart(4, '0'))) const keyMaterial = await crypto.subtle.importKey('raw', digest, 'PBKDF2', false, ['deriveKey']) return await crypto.subtle.deriveKey( { name: 'PBKDF2', salt, iterations: 1, hash: 'SHA-256' }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt'] ) } async function _decrypt(key, data) { const buffer = new Uint8Array(atob(data).split('').map((c) => c.charCodeAt(0))) const iv = buffer.slice(0, 12) const encrypted = buffer.slice(12) const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, encrypted) return (new TextDecoder()).decode(decrypted) } async function unlock(passcode) { const key = await _convertPasscodeToKey(passcode) return await _decrypt(key, encrypted) }

Slide 25

Slide 25 text

೥+BWB4DSJQU ԠืΫΠζ w ྫ೥ΑΓͪΐͬͱ೉қ౓͕ߴ͍ w ʢώϯτΛݟͯʣղ͖ํ͕Θ͔Δ͔Ͳ͏͔ w ղ͖ํ͕Θ͔Δਓ͸GPSจΛॻ͚Δ͸ͣ w 5XJUUFSΛݟ͍ͯͨΒී௨ʹϓϩͷΤϯδχΞ͕ͨͪղ͍͍ͯͨ

Slide 26

Slide 26 text

ԠืΫΠζ͸ɺ͓΋ͯͳ͠

Slide 27

Slide 27 text

߈ུνϟʔτ Ԡื ॻྨબߟ ໘ஊ ࠾༻

Slide 28

Slide 28 text

ॻྨબߟ

Slide 29

Slide 29 text

Ͳ͏ݟΒΕ͍ͯΔ͔Λ஌Δ Ԡืॻྨͷॻ͖ํ w ॻྨબߟ׭ʢࢲͰ͢ʣ͸ w ຖே͔࣌Β࣌ʹॻྨΛ֬ೝ͍ͯ͠Δ w ΠϯλʔϯͷԠื͸શһ෼ݟΔ w ॻ͍ͯ͋Δ͜ͱ͸ͻͱͱ͓ΓݟΔ w ϙʔτϑΥϦΦ͔Β4/4ͷΞΧ΢ϯτ·Ͱ

Slide 30

Slide 30 text

ॏࢹ͍ͯ͠Δ͜ͱ Ԡืॻྨͷॻ͖ํ w ؍ଌͰ͖ΔΞ΢τϓοτ w ϒϩά΍8JLJ w (JU)VC্ͷίʔυ w ΠϯλʔωοταʔϏε͕޷͖ͦ͏͔ w ࣄۀͷυϝΠϯʹؔ৺͕͋Δ͔

Slide 31

Slide 31 text

ϒϩά΍8JLJ Ԡืॻྨͷॻ͖ํ w χονͰ΋ɺࣗ෼Ͱௐ΂ͨΓࢼߦࡨ ޡͨ͜͠ͱ w ଞͷਓʹ໾ʹཱͭΑ͏ʹҰൠԽ͞ Ε͍ͯΔͱͳ͓ྑ͍ w ࢲ͸0CKFDUJWF$ͷ࠷ۙʢ೥ ౰࣌ج४Ͱʣͷॻ͖ํΛࢦೆ͢Δϒ ϩάΛॻ͍͍ͯ·ͨ͠ʜʜ

Slide 32

Slide 32 text

(JU)VC্ͷίʔυ Ԡืॻྨͷॻ͖ํ w ୭͔ʹͱͬͯ༗༻ͳΞϓϦέʔγϣϯ΍ϥΠϒϥϦ w ࣗ෼ʹͱͬͯ༗༻ɺͰ0, w ͠͹Β͘ϝϯςφϯε͕ଓ͍͍ͯΔ΋ͷͩͱͳ͓ྑ͍ w ϝϯςφϯε͠ଓ͚ΔதͰಘΒΕΔֶͼ͕͋Δ

Slide 33

Slide 33 text

ίʔυ Ԡืॻྨͷॻ͖ํ w ΦʔϓϯʹͰ͖ͳ͍΋ͷͰ΋ݖར ্໰୊ͳ͚Ε͹ݟͤͯ΄͍͠ w ࢲ͸஌Γ߹͍ͷσβΠφʔͱ࡞ ͍ͬͯͨ࣌ܭΞϓϦͷίʔυ Λ[JQͰఏग़͠·ͨ͠

Slide 34

Slide 34 text

߈ུνϟʔτ Ԡื ॻྨબߟ ໘ஊ ࠾༻

Slide 35

Slide 35 text

໘ஊ

Slide 36

Slide 36 text

ָ͓͘͠࿩ ໘ஊ w ࠷ॳʹࣄ຿తͳ͜ͱΛ࢕͍·͢ w ೔ఔ΍ر๬ͷνʔϜͳͲʹ͍ͭͯᴥᴪ͕ͳ͍͔֬ೝ w ͋ͱ͸཰௚ʹɺָ͓͘͠࿩͠Ͱ͖ͨΒ0, w ΠϯλʔϯͰԿΛ΍Γ͍͔ͨ w ΤϯδχΞϦϯάʹ͍ͭͯͷڵຯ

Slide 37

Slide 37 text

߈ུνϟʔτ Ԡื ॻྨબߟ ໘ஊ ࠾༻

Slide 38

Slide 38 text

߈ུνϟʔτ ࠾༻

Slide 39

Slide 39 text

͸ͯͳΠϯλʔϯԠื35" )BUFOB&OHJOFFS4FNJOBS w ͳΔ΂͘Ԡืͷաఔ͔Βָ͠ΊΔΑ͏ʹ͍ͨ͠ w ͪΌΜͱݟ͍ͯ·͢ w Ԡื͢Δͷ͸λμʂ w ؾܰʹ͝Ԡื͍ͩ͘͞

Slide 40

Slide 40 text

IBUFOBDPKQSFDSVJUJOUFSO