iOSのKeyChainとiPhoneのバックアップ手段の関係

# このページの内容

iOSのKeyChainに保存した値やオブジェクトを各種iPhoneで用意されているバックアップ手段を用いてバックアップ→復元した時になにが起こるのか、というまとめです。

KeyChain Servicesの概要は古い記事ですが、[こちら](http://cocoadays.blogspot.jp/2011/02/ios-keychain-services.html)を参照したりしています。

間違いなどあればコメントください。

# iOSにおけるKeyChain Servicesの仕組みをおさらい

iOSにおけるKeyChainの設計はMacのそれとは結構違っており、いくつかの特徴があるようです。

```
- iOS には単一のキーチェーンのみ存在する（Mac OS X は複数）。
- iOS の場合、PC接続時にストレージの内容は暗号化されたままバックアップされる。これを復号化するパスワード(keychain password)はバックアップされない（iOSデバイスの中から外に持ち出されない）。
- Keychain Service はプロビジョニングファイルの情報を利用する。この為、アプリケーションをバージョンアップする場合、同じプロビジョニングファイルを使うことが推奨される。[*1]

[*1] アクセス権限を決定する Keychain Access Group の値にデフォルトでプロビジョニングファイルで定義される App Identifier が使用される為。
```
引用: http://cocoadays.blogspot.jp/2011/02/ios-keychain-services.html

とのことです。

# バックアップ手段によるKeyChainの復元可否

![スクリーンショット 2015-08-26 15.16.09.png](https://qiita-image-store.s3.amazonaws.com/0/30355/18339fde-0ca6-7ec5-4cf5-df69d84e9ac8.png)

## コンピュータへのバックアップ（「iPhoneのバックアップを暗号化」しない）
iTunesにiPhoneを接続してバックアップを行う。この場合、以下のドキュメントの内容にもある通り、KeyChainのデータ自体はバックアップされるが、システムが端末上で自動生成したKeyChain Passwordがバックアップされないため、他の端末で復元した際にはKeyChainの内容は読み出せないような仕組みになっているようです。

```
iPhone Keychain Backups

In iOS, an application always has access to its own keychain items and does not have access to any other application’s items. The system generates its own password for the keychain, and stores the key on the device in such a way that it is not accessible to any application. When a user backs up iPhone data, the keychain data is backed up but the secrets in the keychain remain encrypted in the backup. The keychain password is not included in the backup. Therefore, passwords and other secrets stored in the keychain on the iPhone cannot be used by someone who gains access to an iPhone backup. For this reason, it is important to use the keychain on iPhone to store passwords and other data (such as cookies) that can be used to log into secure web sites.
```

引用: https://developer.apple.com/library/mac/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html

## 「iPhoneのバックアップを暗号化」を有効化してコンピュータへのバックアップ

この方法でバックアップした場合は、KeyChain Passwordごと再度暗号化されてバックアップされ、これが他の端末へ移行されてもKeyChain Passwordが復元されることでKeyChain内のデータを取り扱えるようになるようです。

```
バックアップキーバッグは、暗号化されたバックアップが「iTunes」によって作成されたときに作成
され、デバイスがバックアップされているコンピュータに保存されます。新しい鍵のセットを含む新
しいキーバッグが作成され、バックアップされたデータはこれらの新しい鍵で再度暗号化されます。
前述したように、移行不可のキーチェーン項目は UID 由来の鍵でラップされたままになっているた
め、これらはオリジナルのバックアップ元のデバイスには復元できますが、別のデバイス上に復元し
た場合はアクセスできなくなります。
バックアップキーバッグは「iTunes」で設定されたパスワードで保護され、PBKDF2 が 10,000 回
反復実行されます。反復回数はこれだけ多く設定されていますが、特定のデバイスには関連付けられ
ません。そのため理論上は、バックアップキーバッグは多くのコンピュータから同時並行的に総当た
り（ブルートフォース）攻撃される可能性があります。こうした脅威は、十分に強いパスワードを
使用することで軽減できます。
ユーザが iTunes バックアップを暗号化しないことを選択した場合、データプロテクションクラスに
かかわらずバックアップファイルは暗号化されません。ただし、この場合でもキーチェーンは UID
由来の鍵で保護されます。このため、キーチェーン項目は、バックアップパスワードが設定されてい
る場合にのみ新しいデバイスに移行されます。
```

引用: https://www.apple.com/jp/ipad/business/docs/iOS_8.1_Security_WP_J.pdf


## iCloudバックアップ
https://support.apple.com/kb/PH12519?locale=ja_JP&viewlocale=ja_JP

キーチェーン情報がバックアップされることは明記されていないため、この方法でバックアップした情報を復元する場合はキーチェーンを復元することは出来ません。

# KeyChainへの保存時の属性による復元可否

KeyChain Servicesに定義された ```Keychain Item Accessibility Constants``` のうち ```ThisDeviceOnly```のついた属性を与えてオブジェクトを保存した場合は、たとえ暗号化バックアップを行った上でリストアされても他の端末で利用することができなくなるようです。

# 復元のパターンまとめ

## 機種変更時

KeyChainの「暗号化バックアップ」つまりコンピュータへのバックアップでかつ、「iPhoneのバックアップを暗号化」している状態のバックアップから復元していないとKeyChain内のデータは読み出せない

## 機種変更していない場合

KeyChain内のデータ自体はバックアップされており、KeyChain Passwordも端末内に保持されていれば、「暗号化バックアップ」していなくてもデータは読み出せる

# 参考情報

以下のページを参考にさせていただきました。
ありがとうございます。

- https://support.apple.com/ja-jp/HT204136
- https://developer.apple.com/library/ios/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html#//apple_ref/doc/uid/TP30000897-CH204-TP9
- https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices/
- http://cocoadays.blogspot.jp/2011/02/ios-keychain-services.html
- http://did2memo.net/2012/10/02/iphone-how-to-backup-and-restore-key-chain/