【Swift5】ざっくりと理解するキーチェーンアクセス

パスコードロック機能を実装したかったので、キーチェーンアクセスについて改めて調べました。
大幅な変更とかあるのかなーと思ったのですが、追加追加だけで、基本的には昔から変わってない印象。

ノー知識の方にお伝えすると、数値やフラグなどをアプリ内に保存する方法は 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 は使ってます。
本当ありがとうございますですッ。ಠ_ಠ

コメント