Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はてなインターン応募RTA / Hatena Engineer Seminar #24 id:cockscomb

はてなインターン応募RTA / Hatena Engineer Seminar #24 id:cockscomb

Hatena Engineer Seminar #24 「はてなインターン完全攻略マニュアル」 https://developer.hatenastaff.com/entry/engineer-seminar-24 の資料です

Hatena

May 09, 2023
Tweet

More Decks by Hatena

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. Ԡื

    View Slide

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

    View Slide

  13. ೥+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


    }

    View Slide

  14. ೥%PDLFS
    ԠืΫΠζͷྺ࢙

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. ͦͯ͠ɺ೥

    View Slide

  20. ೥+BWB4DSJQU
    ԠืΫΠζ

    View Slide

  21. ೥+BWB4DSJQU
    ԠืΫΠζ

    View Slide

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

    View Slide

  23. ೥+BWB4DSJQU
    ԠืΫΠζ

    View Slide

  24. 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)


    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. ॻྨબߟ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. ໘ஊ

    View Slide

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

    View Slide

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

    View Slide

  38. ߈ུνϟʔτ
    ࠾༻

    View Slide

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

    View Slide

  40. IBUFOBDPKQSFDSVJUJOUFSO

    View Slide