生体認証システム

生体認証システムを使ってデバイスで本人確認をする場合、利便性は高いものの、セキュリティは弱くなる可能性があります。階層型認証モデルでは、第 1 の認証(PIN、パターン、パスワードなどの知識要素に基づくモダリティ)によって最高レベルのセキュリティが確保されます。生体認証システムは、第 2 の認証階層であり、利便性とセキュリティのバランスが取られています。Android CDD では、クラス 3(旧称「強」)、クラス 2(旧称「弱」)、クラス 1(旧称「利便性」)の 3 つのクラスの生体認証強度が定義されています。各クラスには、前提条件、権限、制約があります。詳細については、上記の CDD をご覧ください。これら 3 つのクラスはすべて、ロック画面と統合することが許されています。ただし、android.hardware.biometrics API との統合が許されるのは、「強」と「弱」の認証システムのみです。次の表に、それぞれの認証システムとそれがサポートしている機能を示します。

認証システム ロック画面 BiometricPrompt の統合 キーストア(時間ベースの鍵) キーストア(オペレーション ベースの鍵)
BIOMETRIC_STRONG(クラス 3)
BIOMETRIC_WEAK(クラス 2) × ×
BIOMETRIC_CONVENIENCE
(クラス 1)
× × ×
DEVICE_CREDENTIAL 〇(1)
  1. この機能は Android 11 で追加されました。詳しくはこちらをご覧ください

Android フレームワークは、顔と指紋の生体認証をサポートしています。Android は、他の生体認証モダリティ(虹彩など)をサポートするようにカスタマイズできます。ただし、生体認証システムの統合は、モダリティではなく、生体認証のセキュリティに依存します。生体認証セキュリティの仕様について詳しくは、生体認証を用いたロック解除のセキュリティ測定をご覧ください。

ソース

Android 11

  • BiometricManager.Authenticators インターフェースが導入されています。デベロッパーは、このインターフェースが提供する定数を使用して、アプリが受け入れる認証の種類を指定できます。
  • ACTION_BIOMETRIC_ENROLL というインテントのアクションが追加されています。デベロッパーは、これを使用して、アプリの要件を満たす認証方法を登録するようユーザーを案内できます。
  • AuthenticationResult#getAuthenticationType() メソッドが追加されています。デベロッパーは、これを使用して、ユーザーが生体認証情報とデバイス認証情報のどちらを使用して認証を行ったのかを確認できます。
  • BiometricPrompt クラス内での auth-per-use キーのサポートが追加されています。

Android 10

Android 9

  • BiometricPrompt 向けにのみ指紋認証を統合しています。
  • FingerprintManager クラスは非推奨です。バンドルアプリとシステムアプリでこのクラスを使用する場合は、代わりに BiometricPromptBiometricManager を使用するよう更新します。
  • BiometricPromptBoundKeysTest を使用して BiometricPrompt をテストするよう、FingerprintManager CTS 検証ツールのテストが更新されています。

実装

ユーザーとデベロッパーがシームレスな生体認証を使用できるよう、生体認証スタックを BiometricPromptBiometricManagerACTION_BIOMETRIC_ENROLL の API に統合します。生体認証センサーを搭載したデバイスは、以下の強度に関する要件を満たす必要があります。
生体認証スタックを BiometricPrompt および BiometricManager APIs と統合するには:

  1. <Modality>Service が IBiometricService#registerAuthenticator メソッドで BiometricService に正しく登録され、IBiometricAuthenticator インターフェースを実装するようにしてください。一般的なモダリティ(指紋と顔)は、スーパークラスから拡張されます。サポートされていないモダリティを統合する場合は、指紋またはの例と、生体認証システムに関する CDD のガイドラインを遵守するようにしてください。
  2. SystemUI で新しいモダリティが適切にサポートされていることを確認してください。指紋と顔のデフォルトの BiometricPrompt ユーザー インターフェースがあります。これには、デバイスに必要なレイアウトやテーマの変更を含める必要があります。たとえば、ディスプレイ内指紋認証センサーに対応するレイアウト変更などです。

生体認証スタックを ACTION_BIOMETRIC_ENROLL API と統合するには:

  1. BiometricEnrollActivity を変更して登録フローを提示してください。なお、生体認証システムは、要求された強度を満たしている場合にのみ提供できます。デバイスが複数の生体認証をサポートしている場合、ユーザーが選択できるリストをこのアクションで提示してください。
BiometricPrompt のアーキテクチャ
図 1. BiometricPrompt のアーキテクチャ

HAL 実装のガイドライン

生体認証に関する HAL のガイドラインを遵守して、生体認証データの漏洩を防止し、デバイスからユーザーが削除される際に生体認証データも削除されるようにします。

  • 未処理の生体認証データや派生物(テンプレートなど)に、安全な隔離環境(TEE やセキュア エレメントなど)以外からはアクセスできないようにしてください。保存されるデータはすべて、TEE(高信頼実行環境)のみが把握しているデバイス固有の鍵で暗号化してください。ハードウェアがサポートされている場合は、安全な隔離環境へのハードウェア アクセスを制限し、SELinux ポリシーで保護します。通信チャネル(SPI、I2C など)は、すべてのデバイス ファイルに SELinux ポリシーが明示的に設定されている安全な隔離環境に対してのみアクセス可能にします。
  • データ侵害やその他の攻撃から守るため、生体認証の取得、登録、認識は安全な隔離環境内で行われる必要があります。この要件は、クラス 3(旧称「強」)とクラス 2(旧称「弱」)の生体認証にのみ適用されます。
  • リプレイ攻撃から保護するには、デバイス固有の秘密鍵で生体認証テンプレートに署名します。Advanced Encryption Standard(AES)の場合、少なくとも絶対ファイル システム パス、グループ、生体認証 ID を持つテンプレートに署名する必要があります。このテンプレート ファイルは、他のデバイスでは使用できないものであるか、同じデバイスに登録したユーザーのみが使用できるものであることが前提となります。たとえば、同じデバイス上の別のユーザーによる生体認証データのコピー、または別のデバイスからの生体認証データのコピーを禁止します。
  • TEE の外部にデータを保存する必要がある場合は、setActiveUser() HIDL method が提供するファイル システム パスを使用するか、ユーザーが削除されたときにすべてのユーザー テンプレート データを消去する別の方法を提供します。これは、ユーザーデータの漏洩を防ぐためです。このパスを使用しないデバイスは、ユーザーが削除された後に必ずクリーンアップする必要があります。CDD では、生体認証データと派生ファイルを暗号化された状態で保存することが義務付けられています(特に TEE 内でない場合)。安全な隔離環境のストレージ要件によりそれが不可能な場合は、ユーザーが削除されるとき、またはデバイスがワイプされるときにデータを確実に削除するためのフックを追加してください。LockSettingsService.removeBiometricsForUser() を参照してください。

カスタマイズ

デバイスが複数の生体認証をサポートしている場合、ユーザーが設定でデフォルトを指定できるようにします。BiometricPrompt を実装する際は、ユーザーが明示的にオーバーライドする場合を除いてクラス 3(旧称「強」)の生体認証をデフォルトにする必要があり、生体認証に関連するリスクを説明する警告メッセージを表示します(例: 「自分自身の写真を使ってデバイスのロック解除が可能です」)。

検証

生体認証を実装するには、次のテストに合格する必要があります。

  • CTS BiometricManager
  • CTS BiometricPrompt(基本。検証ツールによってテストの詳細が異なります)
  • CtsVerifier Biometric Test のセクション: デバイスがサポートする各モダリティで合格する必要があります

また、デバイスが AOSP HIDL(fingerprint@2.1fingerprint@2.2face1.0)を持つ生体認証をサポートしている場合、関連する VTS テスト(fingerprintface)に合格する必要があります。