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


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

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

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


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

## キーチェンの仕組み

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

**・キーチェーンの保存のされ方**
アプリで保存されたキーチェンの値はアプリのプロビジョニングファイルとひも付き、さらに保存した時のキーと一緒に暗号化されて保存されます。暗号化は秘密鍵、公開鍵方式(違う鍵使用)と共通鍵方式(同じ鍵使用)を合わせて(ハイブリッド暗号)行っているみたいです(データ全体的には共通鍵をかけてその鍵を受信者側の鍵で暗号化的なものらしい感じかと。 参考:本(出るとこだけ! 基本情報技術者)):rabbit2: <= 以前見た箇所を探せなかったのですが他のappleのサイトでは公開鍵とかいう言葉は使っていませんが、速度的に同じような感じかと思っています！
![スクリーンショット 2023-02-08 2.59.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/db13f83c-a9c0-7920-b05a-1176eefc9417.png)

https://support.apple.com/ja-jp/guide/security/secb0694df1a/web

<img width="661" alt="スクリーンショット 2018-01-13 22.15.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/d036cc05-7a6d-1859-94fd-c5deb32bc3e8.png">


---


**・キーチェーンの値を共有するには**
参考→[How to share Keychain between iOS apps](http://evgenii.com/blog/sharing-keychain-in-ios/)
参考→[[iOS] 複数のキーチェーンアクセスグループを持つアプリではアクセスグループを明示的に指定しよう](https://dev.classmethod.jp/smartphone/iphone/keychain-access-groups/)

こちらの文章に関して以下で文章修正等試したもの載せてます。良さそうであれば以下箇所修正する予定です！
よろしくお願いいたします！

https://kaizenkibokijisaito.com/articles/view/2

 キーチェンの値を自分が持っている他のデバイスのアプリ内で共有したい場合はweb上のicloudにキーチェーンを共有すればいいです。理由はアプリ自体プロビジョニングファイルが同じであること。icloudにログインしているIDが同じであれば、他の自分のデバイスに自分のweb上のicloudに保存してあるキーチェーンを自分のデバイスに共有できるからです。web上のicloudに共有するにはキーチェーンをオンにした場合、パスワードを聞かれるので、パスワードの入力を行ってください。パスワードの入力が行われない場合web上のicloudに共有されないそうです。他アプリで共有したい場合はその他にxcodeの設定が必要になります。
<img width="871" alt="スクリーンショット 2018-01-13 17.55.57のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/875560cc-7b4d-ca86-2873-880e28237907.png">


---
**・いつキーチェーン領域にアクセスできるようになるか** 
端末のキーチェンに関しては自分のiphoneのロックを解除した時にキーチェーンにアクセスできるようです。キーチェンにアクセスするためのキーがパスワードということと認識しています。
<img width="708" alt="スクリーンショット 2018-01-13 22.10.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/973cd457-da56-9f4c-66eb-f39621603d67.png">



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

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

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

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

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

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

参考→[iOSデバイスでiCloudキーチェーンの使用ガイド
](https://www.fonepaw.jp/solution/icloud-keychain.html)
iphoneでキーチェーンを削除する方法は端末にキーチェン保存が行われているユーザーでログインし、設定→icloud→キーチェーン→オフ
で消せるみたいです。

macは個別で消せるのに対して、~~iphoneは全消去しかないらしい~~。
iphoneはwebサイトやテキスト入力時のデータとかの消去のみしか個別でいじれないようです。←検証がしっかりできていないのでもしかしたらwebだけかもしれません。またわかり次第書き直します。
参考URL:
https://moshbox.jp/?p=53408

ただ、アプリで保存した値はここで変更できなさそうです。
token保持しているアプリで、token保持した後にここを見てもそういう値は保存されていませんでした。
もともとあった関連するアプリのアイコンごと削除しても普通にアプリがログイン状態(keychainに保存してるtoken残ってる)だったことをみてもその考えで間違ないのかなと感じています。
方法があれば教えて欲しいです！！:hatched_chick:シャキッ!


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

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

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

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

## キーチェンをiCloudで共有させたくないをアプリから操作する
参考:https://images.apple.com/jp/business-docs/iOS_Security_Guide.pdf

:relaxed:新しい項目を追加しました！！
上記urlの~~17~~19pageにその答えが書いてありました！
その部分の写真も添付しておきます。
<img width="594" alt="スクリーンショット 2019-06-29 17.20.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/99859c81-afb1-5b5b-d53a-19545d464162.png">

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" を書きました](http://blog.kishikawakatsumi.com/entry/2015/01/03/082916)
//Appleさんがキーチェーンについて色々説明してくれている一部
[キーチェーンサービスの概念](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html#//apple_ref/doc/uid/TP30000897-CH204-TP9
)
//とても詳しく丁寧に書いてくださっています。
[[iOS] Keychain Services とは](http://cocoadays.blogspot.jp/2011/02/ios-keychain-services.html)
//ioskeychainの削除について教えていただいたサイトです。
https://tokunagakazuya.tk/yu6
//色々書いてあります
https://images.apple.com/jp/business-docs/iOS_Security_Guide.pdf


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

# キーチェーンに関するニュース
以下に自分が知っておきたいものメモしておきます！ヽ(´▽｀)/　
よろしくお願いします！

#### パスワードがネットで漏えいした可能性がある場合は警告」などの新機能が追加された

>iOS 14で強化され、「パスワードがネットで漏えいした可能性がある場合は警告」などの新機能が追加されたことが明らかとなりました。
[iOS 14ではパスワード漏えいの可能性を警告。iCloudキーチェーンの新機能](https://japanese.engadget.com/ios14-ikeychain-030018682.html?3)


#### iOSバージョン 12.1および12.2でキーチェーンが抜き取れてしまう脆弱性があるようです。

https://blog.trendmicro.co.jp/archives/25416

>以下の情報を窃取するために利用されるモジュールが含まれています
>接続されたWi-Fi履歴
>連絡先
>位置情報
>ハードウェア情報
>iOS キーチェーン
…
>iOSバージョン 12.1および12.2に影響を与えます

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【香港のニュース記事を囮にして拡散する情報窃取型モバイルマルウェアを解説】<br>当社で、香港のiOSユーザを狙う水飲み場型攻撃を確認。端末内の連絡先やキーチェーン、メッセンジャーアプリの情報窃取などを狙ったこの攻撃について解説します。<a href="https://twitter.com/hashtag/iPhone?src=hash&amp;ref_src=twsrc%5Etfw">#iPhone</a><br><br>詳しくは↓<a href="https://t.co/v5KYGsb4Dz">https://t.co/v5KYGsb4Dz</a> <a href="https://t.co/bL61OMqFF0">pic.twitter.com/bL61OMqFF0</a></p>&mdash; トレンドマイクロ (@trendmicro_jp) <a href="https://twitter.com/trendmicro_jp/status/1283310357809774592?ref_src=twsrc%5Etfw">July 15, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>