パスコードロック機能を実装したかったので、キーチェーンアクセスについて改めて調べました。
大幅な変更とかあるのかなーと思ったのですが、追加追加だけで、基本的には昔から変わってない印象。
ノー知識の方にお伝えすると、数値やフラグなどをアプリ内に保存する方法は UserDefaults と Keychain の2パターンあるので、どちらを使えばいいかを比較して進めていきます。(使い方は載せません)
開発環境(前提条件)
・Xcode12
・Swift5
UserDefaults について
アプリの設定情報などを永続的に保存するときに使います。
・音楽プレイヤーのループ設定(全曲/1曲/なし)
・アプリの起動回数
・一度だけ表示するアラートの判定フラグ
などなど、様々な使い方があります。
ただし、画像などの重たいデータは保存してはいけません。(Data型にしたとしても)
そして、UserDefaults はアプリを削除すると同時にデータも削除されます。
Keychain について
セキュアにしたい情報を永続的に保存するときに使います。
UserDefaults は様々な使い方ができますが、Keychain は限られており、以下の5つに分けられます。
・パスワード :kSecClassGenericPassword
・インターネットパスワード:kSecClassInternetPassword
・証明書 :kSecClassCertificate
・秘密鍵/公開鍵等の暗号鍵:kSecClassKey
・秘密鍵付き証明書 :kSecClassIdentity
保存する際にこれらを指定する必要があり、このクラスを見て、暗号化する必要があるかどうかを決定できるようにしています。
(パスワードは暗号化が必要ですが、証明書は暗号化が不要だったりするので)
そして、Keychain はアプリの ProvisioningProfile と紐づいており、保存時のキーと一緒に暗号化されて保存されるので、アプリを削除してもデータは削除されません。
ちなみに、KeychainAccess というライブラリがめっちゃ使いやすいです。
まぁ神が作っているので、そりゃそうだ感ありますけど。
ざっくり比較まとめ
仕様が全然違うので、簡単な表で比較してみます。
UserDefaults | Keychain | |
永続性 | アプリ削除したら消える | アプリ削除しても消えない |
保存先 | アプリ内 | iCloudKeychain |
暗号化 | されない | される |
他機種共有 | できない | できる |
Keychain の保存先が iCloudKeychain となっているのでお察しですが、同じAppleアカウントでログインしたデバイスであれば、そのデバイス間での共有が可能となります。
共有する範囲も設定可能で、「再起動後の初回アンロック〜次回の再起動まで」や「常に許可」、「デバイスがアンロックされた状態」など、結構細かく設定できるので、気になる方は kSecAttrAccessible でお調べください。
さいごに
基本的に UI を含むようなライブラリは使いませんが、RxSwift や RealmSwift などの UI を含まないライブラリは使う派なので、めっちゃ KeychainAccess は使ってます。
本当ありがとうございますですッ。ಠ_ಠ
コメント