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

大規模アプリにおいてデバイス上のユーザデータを安全に暗号化する

 大規模アプリにおいてデバイス上のユーザデータを安全に暗号化する

近年、ユーザデータ保護のためにデバイス上のユーザデータを暗号化した上で保存することが求められるようになりました。しかし、既存の大規模アプリにおいてデバイス上のユーザデータを暗号化するには制約があります。暗号化対応のためにデータにアクセスするアプリ内のコードを全て一気に書き換えることは現実的ではありません。また、暗号化の実装過程で生じるバグによってデバイス上に保存されたユーザのデータが失われることは許されません。
本トークでは、こうした制約下において安全にデバイス上のユーザデータの暗号化を行うために、copy on readやdouble writeポリシーを用いた戦略について、UserDefaultsを暗号化した事例をもとに説明します。
本トークによって、既存の大規模アプリにおいてUserDefaultsのようなデバイス上のユーザデータを安全に暗号化する方法を理解できるようになるでしょう。

ひめし / himeshi_tech https://twitter.com/himeshi_tech

https://fortee.jp/iosdc-japan-2023/proposal/2efea065-73fe-4c1c-a4ca-2bcaad26ab3e

LINE Developers

September 05, 2023
Tweet

More Decks by LINE Developers

Other Decks in Technology

Transcript

  1. ͻΊ͠ʢ"LJNV)JSBJʣ
    -*/&גࣜձࣾ
    େن໛ΞϓϦʹ͓͍ͯσόΠε্ͷ
    ϢʔβσʔλΛ҆શʹ҉߸Խ͢Δ
    !J04%$
    1

    View full-size slide

  2. ͸͡Ίʹ
    w Ϣʔβͷσʔλอޢʹର͢Δػӡ͕·͢·͢ߴ·ΔதɺσόΠεʹอଘ͞ΕͨϢʔ
    βͷσʔλΛ҉߸Խ͢Δ͜ͱ͸ॏཁͰ͋Δɻ
    w J04ͷσʔλӬଓԽखஈͷ͏ͪɺ6TFS%FGBVMUTͱ$PSF%BUB͸σόΠε্ͷσ
    ʔλͷ҉߸Խ͕ߦΘΕ͍ͯͳ͍ɻͦ͜Ͱ-*/&"QQͰ͸ɺ͜ΕΒͷετϨʔδʹ
    อଘ͞ΕͨσʔλΛಠࣗʹ҉߸Խ͢Δ͜ͱʹͳͬͨɻ
    w $PSF%BUBͷ҉߸Խʹ͍ͭͯ͸ɺӈͷ23ίʔυ͔Β
    -*/&%FWFMPQFS%BZͷൃදΛࢀর͞Ε͍ͨɻ

    w σʔλͷ҉߸Խʹ͋ͨͬͯ͸ɺ҉߸ԽͷಋೖʹΑͬͯϢʔβͷσʔλ͕ࣦΘΕΔࣄ
    ଶ͕ൃੜ͠ͳ͍Α͏ʹ͠ͳ͚Ε͹ͳΒͳ͍ɻ
    w ͦ͜ͰຊൃදͰ͸ɺσόΠε্ͷϢʔβσʔλʹ҉߸ԽΛ҆શʹಋೖ͢Δํ๏Λɺ
    6TFS%FGBVMUTͷ҉߸ԽͷࣄྫΛ΋ͱʹઆ໌͢Δɻ
    2

    View full-size slide

  3. 6TFS%FGBVMUTͷ҉߸Խख๏
    ܰྔͳσʔλΛอଘ͢Δ,FZWBMVFετΞʹ͓͍ͯɺ҉߸Խ͕ඞཁͳ৔߹͸
    ,FZDIBJOΛར༻͢Δͷ͕࠷ળखͰ͋ΔɻΑͬͯɺ6TFS%FGBVMUTͷσʔλΛ҉߸
    Խ͢Δ࠷΋ख͔ܰͭ৴པͰ͖Δํ๏͸ɺ6TFS%FGBVMUTͷσʔλΛશͯ,FZDIBJO
    ʹҠߦ͢Δ͜ͱͰ͋Δɻ
    ͔͠͠ͳ͕Β,FZDIBJOͰ6TFS%FGBVMUTΛ୅༻͢ΔͱɺҎԼͷ໰୊͕ଘࡏ͢Δɻ
    w ΞϓϦΛ࡟আ͢Δͱ6TFS%FGBVMUTͷσʔλ͸࡟আ͞ΕΔ͕ɺ,FZDIBJOͷ
    σʔλ͸࢒Δɻ
    w ,FZDIBJO͔Βͷ஋ͷಡΈऔΓ͸6TFS%FGBVMUT͔Βͷ஋ͷಡΈऔΓʹൺ΂ഒ
    Ҏ্஗͍͜ͱ͕͋ΓɺύϑΥʔϚϯε΁ͷӨڹ͕ݒ೦͞ΕΔɻ
    Ҏ্ͷഎܠ͔Β6TFS%FGBVMUTͷ҉߸ԽΛߦ͏ʹ͋ͨͬͯɺ-*/&ΞϓϦͰ͸શͯͷ
    σʔλΛ,FZDIBJOʹҠ͢ͷͰ͸ͳ͘ɺσʔλࣗମ͸6TFS%FGBVMUTʹอଘ͠ͳ
    ͕Β҉߸ԽΛߦ͏͜ͱͱͨ͠ɻ
    3

    View full-size slide

  4. 6TFS%FGBVMUT҉߸Խͷجຊํ਑
    4
    ,FZDIBJO
    6TFS%FGBVMUT
    $SZQUP,JU $SZQUP,JU
    ᶃ҉߸ݤΛऔಘ
    ᶄ҉߸Խ͞Εͨ
    ஋Λऔಘ
    ᶅ6TFS%FGBVMUTͷ஋Λ
    ,FZDIBJOͷݤͰ෮߸ͯ͠ར༻
    ஋Λ6TFS%FGBVMUT͔ΒಡΈऔΔͱ͖ ஋Λ6TFS%FGBVMUTʹॻ͖ࠐΉͱ͖
    ᶃ҉߸ݤΛऔಘ
    ᶅ҉߸Խ͞Εͨ
    ஋Λ֨ೲ
    ᶄ6TFS%FBGVMUTʹॻ͖ࠐΉ஋Λ
    ,FZDIBJOͷݤͰ҉߸Խ
    w $SZQUP,JUʹΑͬͯ஋Λ҉߸Խͯ͠6TFS%FGBVMUTʹอଘ͢Δɻ
    w ҉߸ݤ͸,FZDIBJOʹอଘ͢Δɻ
    w 6TFS%FGBVMUT΁ͷΞΫηε͸ɺ
    ӈͷΑ͏ʹQSPQFSUZXSBQQFSΛ༻͍ͯߦ͏ɻ
    @UserDefault(key: "MyValue")
    static var myValue: String?
    print(myValue)
    myValue = "iOSDC 2023"
    "QQ
    "QQ

    View full-size slide

  5. ҉߸Խͷಋೖʹ͓͚Δݒ೦ࣄ߲
    ҉߸ԽͷಋೖʹΑͬͯ6TFS%FGBVMUT͕ར༻ෆೳʹͳΔ͜ͱ͸ආ͚ͳ͚Ε͹ͳΒͳ͍ɻ
    ্هͷߏ੒Ͱ6TFS%FGBVMUT͕ར༻ෆೳʹͳΔέʔεͱͯ͠ɺҎԼ͕ߟ͑ΒΕΔɻ
    ,FZDIBJO͔Β҉߸ݤͷऔಘʹࣦഊ͢ΔέʔεʢಡΈऔΓɺॻ͖ࠐΈखॱͷᶃʣ
    $SZQUP,JUΛ༻͍ͨ஋ͷ҉߸Խʹࣦഊ͢Δέʔεʢॻ͖ࠐΈखॱͷᶄʣ
    $SZQUP,JUΛ༻͍ͨ஋ͷ෮߸ʹࣦഊ͢ΔέʔεʢಡΈऔΓखॱͷᶅʣ
    ຊ൪؀ڥԼͰ࣮ࡍʹ͜ΕΒͷΤϥʔ͕ൃੜ͢Δ͜ͱ͕ͳ͍͔Λ֬ೝ͢Δඞཁ͕͋Δɻ
    ͦ͜Ͱɺฏจ6TFS%FGBVMUTΛআڈ͢Δલʹ҉߸6TFS%FGBVMUT͕ৗʹػೳ͢Δ͔ຊ൪
    ؀ڥͰݕূ͢Δ͜ͱʹͨ͠ɻ
    5

    View full-size slide

  6. Ҡߦɾݕূ༻ͷߏ੒ʢσʔλͷಡΈऔΓʣ
    6
    ,FZDIBJO
    ҉߸6TFS%FGBVMUT
    $SZQUP,JU
    ᶃ҉߸ݤΛऔಘ
    ᶄ҉߸Խ͞Εͨ஋Λ
    औಘ
    ᶅऔಘ͞Εͨ҉߸஋ͷෳ߸ΛࢼΈΔ
    ஋Λ6TFS%FGBVMUT͔ΒಡΈऔΔͱ͖
    ฏจ6TFS%FGBVMUT
    ᶆฏจͷ஋Λऔಘ͢Δ
    ᶇฏจͷ஋Λ҉߸Խͯ֨͠ೲ
    w ฏจ6TFS%FGBVMUTͱ҉߸6TFS%FGBVMUTΛซ༻͢Δɻ
    w σʔλͷಡΈऔΓ࣌͸ɺ·ͣ҉߸6TFS%FGBVMUT͔Β஋ΛऔΓग़͢ʢਤதᶃᶅʣɻ
    w ҉߸6TFS%FGBVMUT͔Β஋ͷऔΓग़͠ʹࣦഊͨ࣌͠͸ɺ
    ฏจ6TFS%FGBVMUT͔Β஋Λऔಘ͢Δʢਤதᶆʣɻ
    w ҰؾʹσʔλΛ҉߸6TFS%FGBVMUTʹҠߦ͢ΔͷͰ͸ͳ͘ɺฏจ6TFS%FGBVMUT͔Β
    ஋͕औಘ͞Εͨࡍʹ҉߸6TFS%FGBVMUTʹ஋Λෳ੡͢Δʢਤதᶇʣɻ
    "QQ

    View full-size slide

  7. Ҡߦɾݕূ༻ͷߏ੒ʢσʔλͷॻ͖ࠐΈʣ
    7
    ,FZDIBJO
    ҉߸6TFS%FGBVMUT
    $SZQUP,JU
    ᶃ҉߸ݤΛऔಘ
    ᶄॻ͖ࠐΉ஋Λ
    ,FZDIBJOͷݤͰ҉߸Խ
    ฏจ6TFS%FGBVMUT
    ᶆฏจͷ஋Λอଘ͢Δ
    ᶅ҉߸Խ͞Εͨ஋Λอଘ͢Δ
    w ৗʹɺฏจ6TFS%FGBVMUTͱ҉߸6TFS%FGBVMUT྆ํʹ৽͍͠஋Λॻ͖ࠐΉɻ
    ஋Λ6TFS%FGBVMUTʹॻ͖ࠐΉͱ͖
    "QQ

    View full-size slide

  8. σʔλܕͷઃܭ
    /// ฏจUserDefaultsʹͦͷ··อଘͰ͖ΔܕΛද͢ϓϩτίϧ

    public protocol UserDefaultRawType {}
    /// `Data` ܕͱ૬ޓม׵͢ΔͨΊͷϓϩτίϧɻ஋Λ҉߸Խ͢ΔͨΊʹඞཁɻ
    public protocol DataConvertible {
    init?(data: Data)
    var data: Data { get }
    }
    /// ฏจUserDefaults͓Αͼ҉߸UserDefaultsʹ஋ΛอଘͰ͖ΔܕΛද͢ϓϩτίϧ

    public protocol UserDefaultConvertible: DataConvertible {
    /// ฏจUserDefaultsʹ஋Λอଘ͢Δࡍʹ༻͍Δܕ
    associatedtype UserDefaultValue: UserDefaultRawType
    init?(userDefaultValue: UserDefaultValue)
    var userDefaultValue: UserDefaultValue? { get }
    }
    ஋Λ҉߸Խ͢Δࡍʹɺ$SZQUP,JUʹ౉͢஋͸%BUBܕͰͳ͚Ε͹ͳΒͳ͍ɻ
    ฏจ6TFS%FGBVMUT͓Αͼ҉߸6TFS%FGBVMUTʹ஋ͷอଘ͕ՄೳͳܕΛදͨ͢Ίʹɺ
    ԼهͷΑ͏ͳܕΛઃܭͨ͠ɻ6TFS%FGBVMUTʹ஋Λอଘ͢ΔͨΊʹ͸ɺ஋ͷܕ͕
    UserDefaultConvertibleʹ४ڌ͢Δ͜ͱ͕ඞཁͰ͋Δɻ
    8

    View full-size slide

  9. 6TFS%FGBVMUT҉߸Խͷಋೖखॱ
    ͜͜·Ͱʹड़΂ͨߏ੒Λ༻͍ͯɺ-*/&"QQͰ͸࣍ͷΑ͏ʹ6TFS%FGBVMUTͷ҉߸ԽΛ
    ಋೖ͍ͯ͠Δɻ
    ฏจ6TFS%FGBVMUTΛซ༻ͨ͠҉߸6TFS%FGBVMUTͷద༻Λ։࢝͢Δɻ
    ҉߸6TFS%FGBVMUTͷಡΈॻ͖Ͱൃੜͨ͠ΤϥʔΛऩूɺ෼ੳ͠ɺ໰୊Λղܾ͢Δɻ
    ίʔυʹ͓͍ͯΞϓϦதͷ6TFS%FGBVMUT΁ͷΞΫηε͕શͯ҉߸6TFS%FGBVMUTΛ
    ܦ༝͢ΔΑ͏ʹͳͬͨ͜ͱΛ֬ೝ͢Δɻ
    ฏจ6TFS%FGBVMUTͷ஋Λશͯ҉߸6TFS%FGBVMUTʹෳ੡͠ɺฏจ6TFS%FGBVMUTΛ
    ࡟আ͢Δɻ
    9

    View full-size slide

  10. ·ͱΊ
    w Ϣʔβσʔλͷอޢͷॏཁੑͷߴ·Δதɺ6TFS%FGBVMUTΛ͸͡Ίͱ͢Δ୺຤্ͷ
    σʔλετΞΛ҉߸Խ͢Δ͜ͱ͸ॏཁͰ͋ΔɻͦͷҰํͰɺ҉߸Խͷಋೖաఔʹ
    ͓͍ͯϢʔβσʔλ͕ࣦΘΕΔࣄଶΛىͯ͜͠͸ͳΒͳ͍ɻ
    w ҉߸ԽʹΑͬͯ໰୊͕Ҿ͖ى͜͞Εͳ͍͜ͱΛ֬ೝ͢ΔͨΊʹɺ࣮ࡍʹ҉߸ԽΛಋ
    ೖ͠ɺ҉߸Խ͞ΕͨετΞʹ͓͍ͯϢʔβσʔλ͕ར༻ෆೳʹͳΔঢ়گ͕ͳ͍͜ͱ
    Λຊ൪؀ڥʹ͓͍ͯ֬ೝ͢Δඞཁ͕͋Δɻ
    w ͦ͜ͰɺฏจετΞͱ҉߸Խ͞ΕͨετΞΛซ༻͠ɺ҉߸ετΞͷՄ༻ੑΛݕূ͢
    Δɻ҉߸ετΞͷݕূத͸ɺฏจετΞͱ҉߸ετΞ྆ํʹॻ͖ࠐΈΛߦ͏ɻ
    ಡΈࠐΈ͸҉߸ετΞΛओͱͯ͠༻͍Δɻ
    w ҉߸ετΞͷՄ༻ੑΛे෼ʹݕূͨ͠ͷͪʹฏจετΞΛআڈ͢Δ͜ͱͰɺ҆શʹ
    ୺຤্ͷετΞͷ҉߸ԽΛ࣮ݱͰ͖Δɻ
    10

    View full-size slide