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

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

LINE Developers
September 05, 2023

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

近年、ユーザデータ保護のためにデバイス上のユーザデータを暗号化した上で保存することが求められるようになりました。しかし、既存の大規模アプリにおいてデバイス上のユーザデータを暗号化するには制約があります。暗号化対応のためにデータにアクセスするアプリ内のコードを全て一気に書き換えることは現実的ではありません。また、暗号化の実装過程で生じるバグによってデバイス上に保存されたユーザのデータが失われることは許されません。
本トークでは、こうした制約下において安全にデバイス上のユーザデータの暗号化を行うために、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. ͸͡Ίʹ w Ϣʔβͷσʔλอޢʹର͢Δػӡ͕·͢·͢ߴ·ΔதɺσόΠεʹอଘ͞ΕͨϢʔ βͷσʔλΛ҉߸Խ͢Δ͜ͱ͸ॏཁͰ͋Δɻ w J04ͷσʔλӬଓԽखஈͷ͏ͪɺ6TFS%FGBVMUTͱ$PSF%BUB͸σόΠε্ͷσ ʔλͷ҉߸Խ͕ߦΘΕ͍ͯͳ͍ɻͦ͜Ͱ-*/&"QQͰ͸ɺ͜ΕΒͷετϨʔδʹ อଘ͞ΕͨσʔλΛಠࣗʹ҉߸Խ͢Δ͜ͱʹͳͬͨɻ w $PSF%BUBͷ҉߸Խʹ͍ͭͯ͸ɺӈͷ23ίʔυ͔Β

    -*/&%FWFMPQFS%BZͷൃදΛࢀর͞Ε͍ͨɻ  w σʔλͷ҉߸Խʹ͋ͨͬͯ͸ɺ҉߸ԽͷಋೖʹΑͬͯϢʔβͷσʔλ͕ࣦΘΕΔࣄ ଶ͕ൃੜ͠ͳ͍Α͏ʹ͠ͳ͚Ε͹ͳΒͳ͍ɻ w ͦ͜ͰຊൃදͰ͸ɺσόΠε্ͷϢʔβσʔλʹ҉߸ԽΛ҆શʹಋೖ͢Δํ๏Λɺ 6TFS%FGBVMUTͷ҉߸ԽͷࣄྫΛ΋ͱʹઆ໌͢Δɻ 2
  2. 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
  3. 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
  4. Ҡߦɾݕূ༻ͷߏ੒ʢσʔλͷಡΈऔΓʣ 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
  5. Ҡߦɾݕূ༻ͷߏ੒ʢσʔλͷॻ͖ࠐΈʣ 7 ,FZDIBJO ҉߸6TFS%FGBVMUT $SZQUP,JU ᶃ҉߸ݤΛऔಘ ᶄॻ͖ࠐΉ஋Λ ,FZDIBJOͷݤͰ҉߸Խ ฏจ6TFS%FGBVMUT ᶆฏจͷ஋Λอଘ͢Δ

    ᶅ҉߸Խ͞Εͨ஋Λอଘ͢Δ w ৗʹɺฏจ6TFS%FGBVMUTͱ҉߸6TFS%FGBVMUT྆ํʹ৽͍͠஋Λॻ͖ࠐΉɻ ஋Λ6TFS%FGBVMUTʹॻ͖ࠐΉͱ͖ "QQ
  6. σʔλܕͷઃܭ /// ฏจ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
  7. ·ͱΊ w Ϣʔβσʔλͷอޢͷॏཁੑͷߴ·Δதɺ6TFS%FGBVMUTΛ͸͡Ίͱ͢Δ୺຤্ͷ σʔλετΞΛ҉߸Խ͢Δ͜ͱ͸ॏཁͰ͋ΔɻͦͷҰํͰɺ҉߸Խͷಋೖաఔʹ ͓͍ͯϢʔβσʔλ͕ࣦΘΕΔࣄଶΛىͯ͜͠͸ͳΒͳ͍ɻ w ҉߸ԽʹΑͬͯ໰୊͕Ҿ͖ى͜͞Εͳ͍͜ͱΛ֬ೝ͢ΔͨΊʹɺ࣮ࡍʹ҉߸ԽΛಋ ೖ͠ɺ҉߸Խ͞ΕͨετΞʹ͓͍ͯϢʔβσʔλ͕ར༻ෆೳʹͳΔঢ়گ͕ͳ͍͜ͱ Λຊ൪؀ڥʹ͓͍ͯ֬ೝ͢Δඞཁ͕͋Δɻ w

    ͦ͜ͰɺฏจετΞͱ҉߸Խ͞ΕͨετΞΛซ༻͠ɺ҉߸ετΞͷՄ༻ੑΛݕূ͢ Δɻ҉߸ετΞͷݕূத͸ɺฏจετΞͱ҉߸ετΞ྆ํʹॻ͖ࠐΈΛߦ͏ɻ ಡΈࠐΈ͸҉߸ετΞΛओͱͯ͠༻͍Δɻ w ҉߸ετΞͷՄ༻ੑΛे෼ʹݕূͨ͠ͷͪʹฏจετΞΛআڈ͢Δ͜ͱͰɺ҆શʹ ୺຤্ͷετΞͷ҉߸ԽΛ࣮ݱͰ͖Δɻ 10