・なぜキーチェーンについて書こうと思ったか?


iosのキーチェーンアクセスはUserDefaultsよりセキュアに値を保存できますが、その仕組みが理解できてなく、理解しなくては行けなくなりまとまったためqiitaに書こうと思いました。では、説明を開始します。よろしくお願いします。:hatching_chick::sunny:

・そもそもキーチェンとUserDefaultsの違いとは?


UserDefaults キーチェン
アプリ削除でどうなる 値はなくなる 値はなくならない
保存された値はどこに保存されているの? アプリの中 デバイスの中(詳しくいうとデバイスのicloudのキーチェンの中)
保存のされかた そのまま 暗号化
値の共有は可能か? 不可能 一定の条件を満たせば可能
他アプリからアクセスは可能か? 不可能 一定の条件を満たせば可能
どういう時に使うか1 そこまでセキュアな情報でない値を保存する時 セキュアな値を保存する時(apple推奨)
どういう時に使うか2 アプリ削除で値も無くしたい時 再びアプリがインストールされたら、保存していた値を使いたい時

・キーチェンの仕組み


ここでは一生懸命作成した図と一緒に説明します。:shamrock:

・キーチェーンの保存のされ方
アプリで保存されたキーチェンの値はアプリのプロビジョニングファイルとひも付き、さらに保存した時のキーと一緒に暗号化されて保存されます。暗号化は秘密鍵、公開鍵方式と共有鍵方式を合わせて行っているみたいですが、この合わせ技とはどうのようなものなのか今の所はちょっとイメージできてません。:rabbit2:
スクリーンショット 2018-01-13 22.15.10.png


・キーチェーンの値を共有するには
参考→How to share Keychain between iOS apps
参考→[iOS] 複数のキーチェーンアクセスグループを持つアプリではアクセスグループを明示的に指定しよう
キーチェンの値を自分が持っている他のデバイスのアプリ内で共有したい場合はweb上のicloudにキーチェーンを共有すればいいです。理由はアプリ自体プロビジョニングファイルが同じであること。icloudにログインしているIDが同じであれば、他の自分のデバイスに自分のweb上のicloudに保存してあるキーチェーンを自分のデバイスに共有できるからです。web上のicloudに共有するにはキーチェーンをオンにした場合、パスワードを聞かれるので、パスワードの入力を行ってください。パスワードの入力が行われない場合web上のicloudに共有されないそうです。他アプリで共有したい場合はその他にxcodeの設定が必要になります。
スクリーンショット 2018-01-13 17.55.57のコピー.png


・いつキーチェーン領域にアクセスできるようになるか
端末のキーチェンに関しては自分のiphoneのロックを解除した時にキーチェーンにアクセスできるようです。キーチェンにアクセスするためのキーがパスワードということと認識しています。
スクリーンショット 2018-01-13 22.10.46.png

・キーチェンを使う時はどんな時なのかをもう少し詳しく


キーチェンはiosならmacでもiphoneでも大事な値の保存で使われているものであり、appleさん曰く大事な値はキーチェーンで保存して欲しいそうです。

しかし、そこまで保存する値が大事でなくアプリ消した時は値も消したい時や、アプリを消して、アプリ再インストールした時、初期化された状態で使いたい場合はキーチェンで保存ではなくUserDefaultsで保存の方が好ましいかと思います。

・iosだとキーチェーンはどんなところで使われているのか


wifiのパス,web閲覧時のログインした時のアカウトやパス,アプリでキーチェーンを使い保存しているものなどです。

・iphoneのキーチェンの値を削除する方法、でその後どうなるのか


参考→iOSデバイスでiCloudキーチェーンの使用ガイド

iphoneでキーチェーンを削除する方法は端末にキーチェン保存が行われているユーザーでログインし、設定→icloud→キーチェーン→オフ
で消せるみたいです。

macは個別で消せるのに関してiphoneは全消去しかないらしい。方法があれば教えて欲しいです!!:hatched_chick:シャキッ!

ですから、iphoneでキーチェーンの値を無くしたい時オフにした時、全て保存されていた値がなくなるので、今まで自動でログインできていたwebログインやwifiなど、毎回ログインが必要になるかと( ・ὢ・ ) とても苦しく、悲しくなるということだと思っています。

・キーチェンについて不安だったところ


最初は値の保存が暗号化されるからと言われても他のアプリからキーでアクセスできてしまうのかという不安などがありました。

しかし、プロビジョニングファイルと連携されていること、許可しなければ他アプリからのアクセスはできないことを知ったので、なるほど安全そうだと安心しました。

・最後に


参考にしたurlをちゃんと書いていなかったので、現在書けていないものがあるかもしれません。見たなーと思う記事を探して一応全て載せたつもりです(>ω<)ごめんなさい。あと、タイトルの中ですごく参考になると思うものは、下のところではなくタイトルのところに参考として載せてあります。

まとめ方に不十分なところもあると思いますが、できればそういう時はご指摘していただけると助かります。その他にこういう風に書いてもらった方がわかりやすかったなどありましたら、今後の参考のため教えていただけると嬉しいです。

この記事が少しでも誰かの役に経てば嬉しく思います:evergreen_tree:

参考


//キーチェーンで保存の際に実際使ってみて使いやすかったライブラリです。
SwiftでKeychainを簡単に使うライブラリ "KeychainAccess" を書きました
//Appleさんがキーチェーンについて色々説明してくれている一部
キーチェーンサービスの概念
//とても詳しく丁寧に書いてくださっています。
[iOS] Keychain Services とは

追記
※おい!!違うぞというところがあればご指摘いただけるとてても助かります(◍•ᴗ•◍)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.