記事

Appのファイルを暗号化する

iOSに保存されたユーザーのデータをディスク上で暗号化して保護します。

概要

データ保護はiOSの機能の1つであり、Appのファイルを保護し、ファイルへの不正アクセスを防止するためのものです。データ保護は、ユーザーがデバイスの有効なパスコードを設定すると自動的に有効になります。ファイルは通常通り読み書きできますが、システムがコンテンツを自動的に暗号化/復号化します。この暗号化/復号化プロセスはハードウェアアクセラレータによって自動処理されます。

ファイルごとに適用するデータ保護レベルを指定します。4つのレベルを指定でき、それぞれのレベルに応じて、ファイルへのアクセスがいつ許可されるかが決まります。ファイルの作成時に保護レベルを指定しない場合は、iOSによって自動的にデフォルトの保護レベルが適用されます。

  • No protection(保護なし)。ファイルに常にアクセスできます。

  • Complete until first user authentication(最初のユーザー認証まで保護)。(デフォルト)最初にユーザーがデバイスをロック解除するまでファイルにはアクセスできません。最初にデバイスがロック解除されて以降は、デバイスがシャットダウンされるか、再起動されるまで継続してファイルにアクセスできます。

  • Complete unless open(既に開いている場合を除き完全な保護)。デバイスがロック解除状態であるときのみ既存のファイルを開くことができます。ファイルが既に開いている場合は、ユーザーがデバイスをロックした後もそのファイルに引き続きアクセスできます。また、デバイスがロック状態のときも、ロック解除状態のときも、ファイルを新規に作成してアクセスすることができます。

  • Complete(完全な保護)。デバイスがロック解除状態であるときのみファイルにアクセスできます。

新しいファイルを1つのステップで作成および暗号化するには、ファイルのコンテンツを含むデータオブジェクトを構築し、write(to:options:)(英語)メソッドを呼び出します。このメソッドを呼び出す際に、ファイルに適用するデータ保護オプションを指定します。リスト1は、Data(英語)インスタンスのコンテンツをファイルに書き込んで、完全な保護レベルで暗号化する方法の例を示しています。

リスト1

最初の書き込み時のファイルの暗号化

do {
   try data.write(to: fileURL, options: .completeFileProtection)
}
catch {
   // Handle errors.
}

既存のファイルのデータ保護レベルを変更するには、NSURL(英語)setResourceValue(_:forKey:)(英語)メソッドを使います。このメソッドの呼び出しでは、新しいデータ保護オプションをfileProtectionKey(英語)リソースキーに割り当てます。リスト2はこのキーを既存のファイルに追加する例を示しています。

リスト2

ディスク上の既存ファイルの暗号化

do {
   try (fileURL as NSURL).setResourceValue( 
                  URLFileProtection.complete,
                  forKey: .fileProtectionKey)
}
catch {
   // Handle errors.
}

暗号化されたファイルへのアクセスの管理

ファイルの保護レベルによっては、ファイルのコンテンツの読み書きの際に、続いてユーザーがデバイスをロックすると、読み書きできなくなることがあります。Appがファイルに確実にアクセスできるようにするには、以下に従ってください。

アクセス先のファイルに「完全な保護」レベルを割り当てるのは、Appがフォアグラウンドにあるときだけにします。Appが位置情報の更新処理などのバックグラウンド機能に対応している場合は、バックグラウンドにあるときにアクセス可能なように、別の保護レベルをファイルに割り当てます。たとえば、フィットネスAppがバックグラウンドでの位置情報イベントの記録に使うファイルに対しては、「既に開いている場合を除き完全な保護」レベルを使用できます。

ユーザーの個人情報を含むファイルや、ユーザーが直接作成したファイルには常に最高レベルの保護が必要です。ユーザーデータファイルに「完全な保護」レベルを割り当て、Appデリゲートメソッドを使ってそれらのファイルへのアクセスを管理してください。Appデリゲートメソッドを使うと、そのファイルがAppからアクセスできなくなる前に、ファイルを閉じることができます。

関連項目

プライバシーへの対応

保護されたリソースへのアクセスを要求する

目的の文字列を指定して、保護されたリソースへのアクセスが必要な理由をユーザーに説明します。