iOS
keychain
キーチェーン

iosのキーチェーンについて


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

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


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

UserDefaults
キーチェン

アプリ削除でどうなる
値はなくなる
値はなくならない

保存された値はどこに保存されているの?
アプリの中
デバイスの中(詳しくいうとデバイスのicloudのキーチェンの中)

保存のされかた
そのまま
暗号化

値の共有は可能か?
不可能
一定の条件を満たせば可能

他アプリからアクセスは可能か?
不可能
一定の条件を満たせば可能

どういう時に使うか1
そこまでセキュアな情報でない値を保存する時
セキュアな値を保存する時(apple推奨)

どういう時に使うか2
アプリ削除で値も無くしたい時
再びアプリがインストールされたら、保存していた値を使いたい時


・キーチェンの仕組み

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


・キーチェーンの保存のされ方

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

その合わせ技はどうやらハイブリッドというらしく以下のリンクが参考になると思うので貼っておきます。セキュアな部分と早い部分のいいとろころらしいのですが、この早い部分はあれなのか?処理的(処理内容)にこっちの方が、公開鍵暗号方式よりもはやくできるのかな?


https://www.ssl.ph/compare/ssl/datalibrary/contents06.html

スクリーンショット 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のキーチェン(icloud)の値を削除する方法、でその後どうなるのか

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



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

で消せるみたいです。

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

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

すみません。語弊がありました。iCloudキーチェーンの削除の方法でキーチェーンの削除ではないため。上記打ち消し線とさせていただきました。

keychainはそもそもiPhoneの中にあり、iCloudでのkeychainの削除は、自分の他端末への共有ができないと言うことだけです。なので、今まで自動でログインできていたwebログインやwifiなど、毎回ログインが必要になる訳ではありません。あくまで他の端末と共有できないだけです。

本当に削除したい場合は、iTunesから初期化。普通の状況ではあまりやらなさそうですね。


・キーチェンをiCloudで共有させたくないをアプリから操作する

参考:https://www.apple.com/jp/business/site/docs/iOS_Security_Guide.pdf

:relaxed:新しい項目を追加しました!!

上記urlの17pageにその答えが書いてありました!

ThisDeviceOnlyのクラスを使えと言うことですね。ただここに書いてあるクラスは全部ではないのでクラスの内容を見たい方は以下urlへ

https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values

私はこの中でicloudにデータ共有しないのなら

kSecAttrAccessibleWhenUnlockedThisDeviceOnly

が一番いいのではないかなと思っています。

この設定は私がオススメしているライブラリの.accessibility(.whenUnlocked)の部分で設定できるみたいです。


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

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

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


・最後に

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

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

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


参考

//キーチェーンで保存の際に実際使ってみて使いやすかったライブラリです。

SwiftでKeychainを簡単に使うライブラリ "KeychainAccess" を書きました

//Appleさんがキーチェーンについて色々説明してくれている一部

キーチェーンサービスの概念

//とても詳しく丁寧に書いてくださっています。

[iOS] Keychain Services とは

//ioskeychainの削除について教えていただいたサイトです。

https://tokunagakazuya.tk/yu6

//色々書いてあります

https://www.apple.com/jp/business/site/docs/iOS_Security_Guide.pdf

追記

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